如何在TraitsUI中更新ListStrEditor,或以其他方式在Python GUI中显示列表?
我正在学习如何使用Traits来为我的Python脚本构建简单的用户界面。我想做一个程序,用户可以通过一个按钮向列表中添加单词,或者通过另一个按钮完全清空列表。
到目前为止,我使用了traits:
myList = List(Str)
myList = ['Item1','Item2'] #Initial items in list
为了在traits UI中显示这个列表,我使用了来自traits UI包的ListStrEditor:
Item('myList', show_label = False, label = 'Data Files', editor = ListStrEditor(auto_add = False)
我编写了两个按钮:
1) 一个是用来向列表中添加项目的按钮(myList.append('item3')
)
2) 另一个是清空列表的按钮(myList = []
)。基本的用户界面很好,按钮可以正常工作,我的列表变量也按预期改变。
但是,问题是我在图形界面中的列表没有更新。如果我点击它,新值会显示出来。不过,我还想可能添加很多项目,想知道有没有办法在旁边加个滚动条?
我查阅了ListStrEditor的手册和用法,虽然我对一些术语有点困惑。显然有一个refresh()
函数,但我不太确定如何将它应用到ListStrEditor上。此外,我也不确定是否需要使用所谓的“适配器”或“处理器”。
如果能给我一些建议或指引,我会非常感激!
1 个回答
4
没有看到更完整的代码,很难知道你的代码为什么不工作。也许你忘了使用 self
呢?比如说,应该用 self.myList.append('Item3')
而不是直接用 myList.append('Item3')
?
下面的代码对我来说是有效的。每当按下按钮时,列表的显示会立即更新。
import random
from traits.api import HasTraits, List, Str, Button
from traitsui.api import ListStrEditor, View, UItem
class Demo(HasTraits):
my_list = List(Str)
add = Button("ADD")
clear = Button("CLEAR")
traits_view = \
View(
UItem('my_list', editor=ListStrEditor(auto_add=False)),
UItem('add'),
UItem('clear'),
)
def _my_list_default(self):
return ['Item1', 'Item2']
def _add_fired(self):
new_item = "Item%d" % random.randint(3, 999)
self.my_list.append(new_item)
def _clear_fired(self):
self.my_list = []
if __name__ == "__main__":
demo = Demo()
demo.configure_traits()
这个方法在 wx 和 qt4+pyside 的环境下都能正常工作。我使用的是 Enthought 的 Python 发行版,EPD 7.3,里面有版本 4.2.0 的 Traits 和 TraitsUI。
如果你的代码和这个差别很大,能不能把你的代码也加到问题里呢?