2014-12-05 63 views
1

如何清除Tix.ComboBox对象中的所有项目?我试过的东西python Tix - 如何清除组合框

cb.entry.delete (0, Tix.END) 

这个功能 其他veriations但它似乎并没有做任何事情。也不清楚从API应该使用哪个函数,我读过的文档对此没有提及。它甚至有可能吗?

谢谢!

编辑:PS删除项目的名字也将是伟大的。无法找到如何做到这一点。

回答

2

由于the docs说,一个ComboBox有一个入口子小部件和一个listbox子小部件。通常组合框请参见the Wikipedia pageSomething else部分是条目,而List item 1等部分是列表框。

因此,cb.entry.delete是完全有效的,但它删除条目子项的内容。这不会影响列表框中的任何项目。


那么,你如何得到listbox?那么,在Tcl/Tk,你可以访问cb.listbox。但是这在Python/Tkinter中不起作用。

如果你看一下the source,你可以看到,ComboBox没有两个子部件,但,其中没有一个是Listbox或命名listbox

entry  Entry 
arrow  Button 
slistbox ScrolledListBox 
tick  Button 
cross  Button : present if created with the fancy option 

(你应该能够在您的交互式解释与help(Tix.ComboBox)看到这一点很容易。)

ScrolledListBox本身是另一个Tix复合widge t,没有任何有用的东西,所以你仍然需要找到Listbox子子控件。看看帮助或source,它会告诉你ScrolledListBox有一个listbox。幸运的是,真的 a Listbox(好吧,_dummyListbox,但这只是一个Listbox子类,知道如何成为Tix subwidget)。

所以,你真的想要的是cb.slistbox.listbox。 (我相信Tcl/Tk会沿着属性引用转发,而Python/Tkinter不会,这就是为什么Tix和其他奇特的Tk包装和扩展不像Tk文档使用Python那么好用的原因。出现。)


需要注意的是,作为ListBox文档说,0指的是第一项,END到最后一个条目,所以在您的调用的参数是正确的。

所以,长话短说,这应该这样做:

cb.slistbox.listbox.delete(0, Tix.END) 

你应该知道如何找到今后发生类似的情况。 (假设你没有那么通过蒂克斯创伤,你避免它彻底。)


同时,据我所知,没有办法通过名字删除,但它并不难做到自己。只需迭代条目并检查它们:

for i in range(cb.slistbox.listbox.size()): 
    if cb.slistbox.listbox.get(i) == name: 
     cb.slistbox.listbox.delete(i) 
     break 
+0

组合框没有属性列表框。你确定这是正确的吗? – 2014-12-06 01:19:43

+0

@Ness:这可能是错误的名称(我的系统上没有Tix库),但是它与此相似。 (访问'entry'绝对不是正确的方式......)让我来看看它。 – abarnert 2014-12-06 01:38:15

+1

@Ness:Tix的Tkinter文档非常稀少,只是将您引导至Tcl/Tk文档。和['tixComboBox'](http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixComboBox.htm)肯定说它有一个'listbox'。所以,如果这是不对的......看看'dir(cb)'看看有没有什么看起来很近,同时我会快速查看'Tix'的来源,看看我能否看到任何奇怪的东西。 – abarnert 2014-12-06 01:40:00