1

如何清除 Tix.ComboBox 对象中的所有项目?我尝试过类似的事情

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

和这个函数的其他版本,但它似乎没有做任何事情。从 API 中也不清楚我应该使用哪个函数,而我读过的文档对此只字未提。有可能吗?

谢谢!

编辑:PS 按名称删除项目也很棒。也找不到如何做到这一点。

4

1 回答 1

2

正如文档所说,一个 ComboBox 有一个条目子小部件和一个列表框子小部件。一般参见组合框的维基百科页面Something else:部分是条目,List item 1等部分是列表框。

所以,cb.entry.delete是完全有效的,但它正在删除条目子小部件的内容。这不会影响列表框中的任何项目。


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

如果查看source,您会发现它ComboBox没有两个子小部件,而是五个,其中没有一个是 aListbox或 named listbox

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

(您应该能够help(Tix.ComboBox)在交互式解释器中轻松看到这一点。)

ScrolledListBox它本身是另一个 Tix复合widget,本身没有任何有用的东西,所以你仍然需要找到Listboxsub-sub-widget。查看帮助或来源,它会告诉你ScrolledListBox有一个listbox. 幸运的是,这确实一个Listbox(嗯,一个_dummyListbox,但这只是一个Listbox知道如何成为子小部件的子类Tix)。

所以,你真正想要的是cb.slistbox.listbox.

(我相信 Tcl/Tk 会沿着属性引用转发,而 Python/Tkinter 不会,这就是为什么从 Python 中使用 Tix 和其他花哨的 Tk 包装器和扩展不如 Tk 文档显示的那样好。)


请注意,正如文档ListBox所说,0指的是第一个条目和END最后一个条目,因此您调用中的参数是正确的。

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

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

你应该知道如何在未来找到类似的案例。(假设你没有被 Tix 伤害到你完全避免它。)


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

for i in range(cb.slistbox.listbox.size()):
    if cb.slistbox.listbox.get(i) == name:
        cb.slistbox.listbox.delete(i)
        break
于 2014-12-06T00:32:32.637 回答