python-tkinter-listbox绑定:为什么这个函数被调用两次



我有两个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选项默认设置为Truelistbox1中的所选项目将被取消选择。因此,它将在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...

最新更新