2013-02-09 22 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

相關問題