Метод привязки с несколькими аргументами к <<ListboxSelect>> - PullRequest
0 голосов
/ 11 марта 2019

Попытка заставить метод выполняться при выборе элемента в списке tkinter.Я могу связать какую-то функцию с использованием .bind("<<ListboxSelect>>", method), но если я попытаюсь дать ему какие-либо аргументы, например method(argumentone, argumenttwo), метод больше не будет выполняться при выборе элемента из списка.Однако он выполняется при запуске, когда запускается Mainloop.Кроме того, предоставление аргументов методу является проблематичным, так как я не могу передать аргумент события, уже переданный любому связанному методу, так как он заранее не назначен какой-либо переменной.Я хотел бы иметь возможность передать событие и еще одну переменную в некоторый метод в идеале.Любая помощь в достижении этого будет очень приветствоваться.Пример кода, которого я пытаюсь достичь

def onSelection(event, foo):
    widget = event.widget
    print(widget.curselection())
    print(foo)


sam = "sam"
chars = Listbox(main)
chars.insert(someList)
chars.bind("<<ListboxSelect>>", onSelection(evt, sam))

Обратите внимание, что этот код не работает.evt не определено.

1 Ответ

1 голос
/ 12 марта 2019

Когда вы указываете функцию в bind(), которая заканчивается в скобках, она просто запускает функцию без привязки, генерируя событие. Вместо этого вы должны дать связать имя. Вы можете сделать это с помощью lambda или functools.partial. Я буду использовать лямбду в моем примере.

Bind генерирует событие при срабатывании, поэтому лямбда будет принимать его как входные данные. Затем позвоните onSelection() с нужными аргументами.

from tkinter import *

main = Tk()

def onSelection(event, foo):
    widget = event.widget
    print(widget.curselection())
    print(foo)

someList = ['Stilton', 'Brie', 'Edam', 'Cheddar', 'Ilchester']

chars = Listbox(main)
chars.pack(padx=10, pady=10)
for item in someList:
    chars.insert("end", item)

sam = "sam"
chars.bind("<<ListboxSelect>>", lambda event: onSelection(event, sam))
# Take care of event created by bind ----^                    ^
# Pass the event as well as argument to callback function ----|

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