代码之家  ›  专栏  ›  技术社区  ›  Igor Dragushhak

如何使两个列表框绑定到同一个函数,而不在选择另一个列表框时为两个列表框运行同一个函数两次?

  •  1
  • Igor Dragushhak  · 技术社区  · 7 年前

    我有这个代码:

    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 回复  |  直到 7 年前
        1
  •  0
  •   Bryan Oakley    7 年前

    当你绑定到 <<ListboxSelect>> 当旧选择丢失时,将调用一次回调,而当新选择进行时,将调用第二次回调。当选择 变化 不只是当它是 设置 ,从选定状态转到未选定状态被视为更改。

    以下是发生的事情:

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

    2. 从第二个列表框中选择。因为你没有设置 exportselection=False ,一次只能选择一个对象。因此,当第一个列表框丢失所选内容时,将调用第一个列表框的回调,当第二个列表框获得所选内容时,将再次调用第二个列表框的回调。

    我需要知道我正在选择什么小工具

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

    如果您希望能够从两个窗口小部件中选择某些内容,请设置 exportselection False 在两个列表框中。然后,当您在第二个列表框中选择某个内容时,由于另一个列表框不会丢失所选内容,所以只会调用一次回调。

    推荐文章