Tkinter связать проблему - PullRequest
3 голосов
/ 13 мая 2011

У меня есть что-то вроде этого:

from Tkinter import *

root = Tk()
root.title("Test")

def _quit():
    root.destroy()

m = Menu(root)
root.config(menu=m)

fm = Menu(m, tearoff=0)
m.add_cascade(label="File", menu=fm)
fm.add_command(label="Quit", command=_quit, accelerator='Ctrl+Q')

root.bind('<Control-Q>', _quit())
root.bind('<Control-q>', _quit())

root.mainloop()

Мой вопрос:
«Почему _quit() всегда вызывается?»

Ответы [ 2 ]

7 голосов
/ 14 мая 2011

Когда вы связываетесь с Tkinter, вы обычно не вызываете функцию, которую хотите связать.

Вы должны использовать линию

root.bind('<Control-Q>', _quit) 

вместо

root.bind('<Control-Q>', _quit())

Обратите внимание на отсутствие скобок за _quit .

Этот код ниже должен работать.

from Tkinter import *

root = Tk()
root.title("Test")

def _quit(event):
    root.destroy()

m = Menu(root)
root.config(menu=m)

fm = Menu(m, tearoff=0)
m.add_cascade(label="File", menu=fm)
fm.add_command(label="Quit", command=lambda: _quit(None), accelerator='Ctrl+Q')

root.bind('<Control-Q>', _quit)
root.bind('<Control-q>', _quit)

root.mainloop()

EDIT:

К сожалению, я выполнил код, проверяющий команду ключевого слова для выхода в строке меню. Не связанные ключевые команды. При выполнении привязок для Tkinter, и я уверен, что большинство GUI-инструментариев, привязка вставляет и аргумент события при вызове функции. Однако аргумент ключевого слова команды Tkinter обычно не вставляет событие. Таким образом, вы должны пойти на компромисс, если аргумент ключевого слова команды «искусственно» вставит аргумент события None ( lambda: _quit (None) ). Это позволяет использовать одну функцию в обоих сценариях.

6 голосов
/ 13 мая 2011

Потому что ты это называешь. Не называйте это:

root.bind('<Control-Q>', _quit)
...