我有两个tkinter.Listbox
。其想法是显示其中一个Listbox
,当选择一个项目时,显示另一个Listbox
。为此,我使用grid_forget
。这是代码:
import tkinter as tk
root = tk.Tk()
listbox1 = tk.Listbox(root)
listbox1.grid(row=0, column=0)
listbox1.insert(tk.END, "Item 1.1")
listbox1.insert(tk.END, "Item 1.2")
def change_listbox(event):
print(listbox1.curselection())
listbox1.grid_forget()
listbox2.grid(row=0, column=0)
listbox1.bind("<<ListboxSelect>>", change_listbox)
listbox2 = tk.Listbox(root)
listbox2.insert(tk.END, "Item 2.1")
listbox2.insert(tk.END, "Item 2.2")
root.mainloop()
当我从listbox1
中选择项目时,会显示listbox2
,但当我选择listbox2
的项目时,change_listbox
会再次调用(仅一次(。您可以通过我添加的print
对此进行检查。
但是,如果我用destroy
更改grid_forget
,问题就解决了,但我不想破坏listbox1
。
这是因为当选择listbox2
中的项目时,由于exportselection
选项默认设置为True
,listbox1
中的所选项目将被取消选择。因此,它将在listbox1
上触发绑定事件<<ListboxSelect>>
。只需在两个列表框中设置exportselection=False
(或0(即可修复。
由于调用是
(0,)
(或(1,)
(最初从列表框中选择项目时,然后是
()
(即"未选择任何项目"(当项目从列表1中被取消选择时(因为您正在从列表2中选择一个项目(,看起来会发生第二次调用。
您可以通过并排放置两个列表框来验证这一点(因此删除forget
内容(:
listbox1.grid(row=0, column=0)
listbox2.grid(row=0, column=1)
当您在第二个列表框中选择一个项目时,第一个列表框的选择将被取消选择。
如果你不在乎取消选择,那么。。。不要:
def change_listbox(event):
sel = listbox1.curselection()
if not sel: # Nothing selected, whatever
return
print("Selected:", sel)
# show list 2 or something...