2013-03-07 3 views
5

Я работает небольшой скрипт, как этотPython Tkinter холст не связывать клавиатуру

from Tkinter import * 
root = Tk() 
def callback(event): 
    print "callback" 
w = Canvas(root, width=300, height=300) 
w.bind("<Key>", callback) 
w.pack() 
root.mainloop() 

Однако, событие клавиатуры не обрабатывается в моей ситуации (я использую Python 2.7 на окне 7)

Если я использую

w.bind("<Button-1>", callback) 

Вещи хорошо работают.

Итак, это действительно меня озадачивает. Пожалуйста, скажите мне, почему это происходит, спасибо заранее.

+0

проверить это http://stackoverflow.com/questions/13326940/python-tkinter-how-to-bind-key-to-a-button – user19911303

ответ

6

Ключи привязаны только к огню, когда виджет с фокусом клавиатуры получает ключевое событие. Полотно по умолчанию делает не получить фокус клавиатуры. Вы можете сосредоточить его на методе focus_set. Обычно вы делаете это в привязке на кнопке мыши.

Добавьте следующие привязки к коду, а затем нажмите на холсте и ваши ключевые привязок начнут работать:

w.bind("<1>", lambda event: w.focus_set()) 
+1

Спасибо Брайан, это проблема фокуса. Хотя код немного отличается. Я заставляю его работать inline 'w.focus_set() w.bind ('', function)' –

+0

@RobertBean: просто, чтобы понять это - вам не нужно делать focus_set перед привязками. Перед тем, как люди начнут использовать клавиатуру, нужно сделать focus_set. –

+0

Я также не понимаю, почему @BryanOakley подчеркивает, что привязывает щелчок мыши с помощью w.focus_set() вместо использования встроенного w.focus_set(). – wsysuper

2

Чтобы избежать «нажав на холсте, чтобы активировать клавиш», я нашел простой код на следующем сайте:

http://ubuntuforums.org/showthread.php?t=1378609

Он пытается связать кадр, но я реализовал это в моем собственном коде и холст виджет работает хорошо. Ваш код будет выглядеть следующим образом:

w.focus_set() 
w.bind(<Key>, callback) 
1

Существует удобный случай в Tkinter называется «Enter», который отслеживает, когда курсор мыши входит в виджет. Если вы привяжете его к холсту, и в обратном вызове привязки для этого события вы можете canvas.focus_set, тогда всякий раз, когда мышь находится на холсте, вы будете иметь фокус, и, таким образом, привязки клавиатуры будут работать.

Это будет работать, даже если холст теряет фокус (скажем, введя текст в другой виджет), потому что, когда мышь снова войдет в холст, он восстановит фокус.

+1

Этот ответ был бы более полным с фрагментом кода. –

Смежные вопросы