我有这个代码:
import tkinter as tk
def onselect(event):
print(event.widget)
root=tk.Tk()
Listbox = tk.Listbox(root)
Listbox2 = tk.Listbox(root)
Listbox.pack(anchor='e', fill='both', expand=True)
Listbox2.pack(anchor='e', fill='both', expand=True)
Listbox.insert('end', 'hello')
Listbox.insert('end', 'bay')
Listbox2.insert('end', 'yes')
Listbox2.insert('end', 'no')
Listbox.bind('<<ListboxSelect>>', onselect)
Listbox2.bind('<<ListboxSelect>>', onselect)
当我从第一个列表框中选择任何元素时,我得到:
.!listbox
但是如果我尝试选择第二个列表框,我会得到:
.!listbox2
.!listbox
但是我只需要获取第二个列表框,为什么它先获取第二个列表框,然后获取第一个? 我怎样才能解决这个问题? 我需要知道我正在选择哪个小部件(如果它能给我小部件的编号那就更好了:第一个列表框 0 第二个 1 等等,如果创建了更多)。
最佳答案
当您绑定(bind)到<<ListboxSelect>>
时,当旧选择丢失时,您的回调将被调用一次,当新选择完成时,您的回调将被调用第二次。该事件被记录为在选择更改时触发,而不仅仅是在设置时触发,并且从选定状态到未选定状态被视为更改。
这是发生的事情:
您从第一个列表框中进行选择,当前没有选择,因此您的回调将被调用一次。
您从第二个列表框中进行选择。因为你没有设置
exportselection=False
,一次只能选择一项。因此,当第一个列表框失去选择时,将为第一个列表框调用您的回调,然后当第二个列表框获得选择时,为第二个列表框再次调用您的回调。
I need to know what widget I am selecting
您将获得一个小部件的引用。您首先需要从该小部件中进行选择。如果选择为空,则可以安全地假设由于取消选择该项目而调用了回调。如果选择不为空,您可以假设回调是因为选择了该项目。
如果您希望能够从两个 widgeta 中选择某些内容,请设置 exportselection
至False
在两个列表框中。然后,当您在第二个选择某些内容时,您的回调只会被调用一次,因为另一个列表框不会丢失选择。
关于python - 如何使 2 个列表框与相同的函数绑定(bind),而无需在选择另一个列表框时为两个列表框运行相同的函数两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52894279/