Как сделать, чтобы 2 списка связывались с одной и той же функцией, не выполняя одну и ту же функцию дважды для двух списков при выборе другого списка? - PullRequest
0 голосов
/ 19 октября 2018

У меня есть этот код:

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 голосов
/ 19 октября 2018

Когда вы связываетесь с <<ListboxSelect>>, ваш обратный вызов будет вызываться один раз, когда старый выбор потерян, и второй раз, когда будет сделан новый выбор.Это событие задокументировано так, что оно срабатывает, когда выбор изменяется , а не только тогда, когда он установлен , и переход из выбранного состояния в невыбранное состояние считается изменением.

Вот что происходит:

  1. Вы выбираете из первого списка, нет текущего выбора, поэтому ваш обратный вызов вызывается один раз.

  2. Вы выбираетеиз второго списка.Поскольку вы не установили exportselection=False, вы можете выбрать только одну вещь за раз.Поэтому ваш обратный вызов будет вызван для первого списка, когда первый список потеряет выбор, а затем снова будет вызван для второго списка, когда второй список получит выбор.

Мне нужно знать, какой виджет я выбираю

Вам дана ссылка на виджет.Сначала вам нужно получить выбор из этого виджета.Если выборка пуста, можно с уверенностью предположить, что был вызван обратный вызов, потому что элемент был отменен.Если выбор не пустой, вы можете предположить, что обратный вызов произошел из-за того, что был выбран элемент.

Если вы хотите иметь возможность выбирать что-то из обоих виджетов, установите exportselection в False на обоихListBoxes.Затем, когда вы выбираете что-то во втором, ваш обратный вызов будет вызываться только один раз, так как другой список не потеряет выбор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...