如何使两个具有相同功能的列表框绑定,而在选择另一个列表框时不对两个lisbox运行两次相同的功能?

时间:2018-10-19 14:19:43

标签: python python-3.x tkinter listbox

我有此代码:

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,如果创建更多,依此类推)。

1 个答案:

答案 0 :(得分:0)

当您绑定到<<ListboxSelect>>时,如果旧选择丢失,则回调将被调用一次,而新选择将被调用第二次。据记录,当选择更改时会触发该事件,而不仅仅是将其设置为 ,并且从选择状态变为未选择状态被视为更改。

这是正在发生的事情

  1. 您从第一个列表框中进行选择,没有当前选择,因此您的回调被调用一次。

  2. 您从第二个列表框中选择。由于您未设置exportselection=False,因此一次只能选择一项。因此,当第一个列表框失去选择时,第一个列表框将被回调,而第二个列表框得到选择时,第二个列表框将被再次调用。

  

我需要知道我要选择的小部件

您将获得对小部件的引用。您首先需要从该小部件中获取选择。如果选择为空,则可以安全地假定已调用回调,因为已取消选择该项。如果选择不为空,则可以假定回调是由于选择了该项。

如果您希望能够从两个小部件中都选择某项,请在两个列表框中将exportselection设置为False。然后,当您第二次选择某个内容时,您的回调将仅被调用一次,因为另一个列表框不会丢失选择。