python - 如何使 2 个列表框与相同的函数绑定(bind),而无需在选择另一个列表框时为两个列表框运行相同的函数两次?

标签 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 等等,如果创建了更多)。

最佳答案

当您绑定(bind)到<<ListboxSelect>>时,当旧选择丢失时,您的回调将被调用一次,当新选择完成时,您的回调将被调用第二次。该事件被记录为在选择更改时触发,而不仅仅是在设置时触发,并且从选定状态到未选定状态被视为更改。

这是发生的事情:

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

  2. 您从第二个列表框中进行选择。因为你没有设置exportselection=False ,一次只能选择一项。因此,当第一个列表框失去选择时,将为第一个列表框调用您的回调,然后当第二个列表框获得选择时,为第二个列表框再次调用您的回调。

I need to know what widget I am selecting

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

如果您希望能够从两个 widgeta 中选择某些内容,请设置 exportselectionFalse在两个列表框中。然后,当您在第二个选择某些内容时,您的回调只会被调用一次,因为另一个列表框不会丢失选择。

关于python - 如何使 2 个列表框与相同的函数绑定(bind),而无需在选择另一个列表框时为两个列表框运行相同的函数两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52894279/

相关文章:

python - Pycharm 警告变量未被使用

mongodb - 更新 MongoDB 中的多个子文档数组

python 组合框默认当前

python - 在 Tkinter Python 中删除

Python 函数不打印 - 仅存储

python - Python 中的非弹性碰撞

python - 如何一次输入多个浮点变量

python-3.x - 通过 jupyter notebook 使用 dask 分布式计算

django - AttributeError : type object 'User' has no attribute 'name'

python - 如何将 pickle 数据保存到 tkinter 输入框或从 tkinter 输入框重新加载?