如何清除 Tix.ComboBox 对象中的所有项目?我尝试过类似的事情
cb.entry.delete (0, Tix.END)
和这个函数的其他版本,但它似乎没有做任何事情。从 API 中也不清楚我应该使用哪个函数,而我读过的文档对此只字未提。有可能吗?
谢谢!
编辑:PS 按名称删除项目也很棒。也找不到如何做到这一点。
如何清除 Tix.ComboBox 对象中的所有项目?我尝试过类似的事情
cb.entry.delete (0, Tix.END)
和这个函数的其他版本,但它似乎没有做任何事情。从 API 中也不清楚我应该使用哪个函数,而我读过的文档对此只字未提。有可能吗?
谢谢!
编辑:PS 按名称删除项目也很棒。也找不到如何做到这一点。
正如文档所说,一个 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,本身没有任何有用的东西,所以你仍然需要找到Listbox
sub-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