2013-02-09 37 views
0

我在学习如何使用Traits为我的Python脚本构建简单的UI。我想用一个列表制作一个用户可以用一个按钮添加单词的列表,或者用另一个按钮完全清除列表。如何在TraitsUI中更新ListStrEditor,或以其他方式在Python GUI中显示列表?

到目前为止,我已经使用特点:

myList = List(Str) 

myList = ['Item1','Item2'] #Initial items in list 

要显示该列表的特质UI,我用ListStrEditor从性状UI包:

Item('myList', show_label = False, label = 'Data Files', editor = ListStrEditor(auto_add = False) 

我已编码的2个按钮: 1)一个用于将项目添加到列表中(myList.append('item3')) 2)清除按钮清空列表(myList = [])。基本的用户界面很好,按钮的工作和我的列表变量按预期更改。

然而,问题是,我在GUI列表不更新。如果我点击它,则显示新值,但是。此外,我想要添加许多项目,并想知道是否有方法向侧面添加滚动条?

我看过了ListStrEditor手册和使用,虽然我变得有点陷入了术语。显然有refresh()功能存在,但我不知道如何将其应用于ListStrEditor。另外,我不确定是否需要使用称为“适配器”或“处理程序”的东西。

任何提示或指针在正确的方向将不胜感激!

+0

你可以包含一个独立的示例来演示问题吗? – 2013-02-09 01:14:24

回答

3

没有看到更完整的代码,就很难知道为什么你的代码不能正常工作。也许你错过了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,它具有Traits和TraitsUI版本4.2.0。

如果您的代码显着不同,您可以将其添加到问题?

+0

谢谢,这工作出色。 这是非常相似,我的代码(注意,我没有及时回复给最低工作示例对不起!),但我想'my_list = [“ITEM2”物品1']'后直放 ' my_list = List(str)'我认为是造成这个问题的原因。 感谢您的帮助! PS,我注意到你已经使用了UItem而不是Item。两者都似乎工作,使用UItem有什么好处吗? – RobMSN 2013-02-11 02:24:57

+1

'UItem'是'Item'的一个子类,带'show_label = False' - 就是这样。看看源位置:https://github.com/enthought/traitsui/blob/master/traitsui/item.py – 2013-02-11 03:43:35

+0

另外,我用的方法'_my_list_default'设置默认值,但是这可能是矫枉过正的这个案例。相反,默认值可以在特性声明中给出,使用'value'关键字':'my_list = List(Str,value = ['Item1','Item2'])' – 2013-02-11 12:25:24

相关问题