如何在TraitsUI中更新ListStrEditor,或以其他方式在Python GUI中显示列表?

0 投票
1 回答
1254 浏览
提问于 2025-04-17 15:18

我正在学习如何使用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。

如果你的代码和这个差别很大,能不能把你的代码也加到问题里呢?

撰写回答