2013-03-07 16 views
5

ja już działa mały skrypt jak tenPython Tkinter Płótno nie wiążą klawiatury Przed

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() 

Jednak zdarzenie klawiatura nie jest obsługiwana w mojej sytuacji (ja używam Pythona 2.7 na Windows 7)

Jeśli używam

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

Wszystko działa dobrze.

To naprawdę mnie zastanawia. Proszę, niech ktoś mi powie, dlaczego to się dzieje, z góry dzięki.

+0

sprawdź to http://stackoverflow.com/questions/13326940/python-tkinter-how-to-bind-key-to-a-button – user19911303

Odpowiedz

6

Wiązania klawiszy są uruchamiane tylko wtedy, gdy widget z ustawioną ostrością klawiatury staje się kluczowym wydarzeniem. Domyślnie płótno ma wartość , a nie. Możesz skupić się na nim metodą focus_set. Zazwyczaj robisz to w wiązaniu za pomocą przycisku myszy.

Dodaj następujące wiążące w kodzie, a następnie kliknąć na płótnie i swój klucz Wiązania rozpocznie pracy:

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

Dzięki Bryan, to jest problem z ostrością. Chociaż kod jest trochę inny. Robię to za pomocą wbudowanego 'w.focus_set() w.bind ('', funkcja)' –

+0

@RobertBean: po prostu, aby było jasne - nie musisz robić focus_set przed powiązaniami. Focus_set musi być zrobiony zanim ludzie zaczną używać klawiatury. –

+0

Nie rozumiem również, dlaczego @BryanOakley naciska, aby związać kliknięcie myszą za pomocą w.focus_set(), zamiast używać wbudowanego w.focus_set(). – wsysuper

2

Aby uniknąć „klikając na płótnie do aktywacji klawiszy”, znalazłem prostszy kod na poniższej stronie:

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

On próbuje powiązać ramkę, ale wprowadziły go w mój własny kod i widżet płótno działa tak samo. Twój kod będzie wyglądać następująco:

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

Jest przydatny w Tkinter wydarzenie o nazwie „Enter”, który śledzi, gdy mysz wejdzie widżet. Jeśli powiążesz to z płótnem i wywołaniem wywołania dla tego zdarzenia, canvas.focus_set, wtedy gdy tylko mysz znajdzie się na kanwie, będziesz miał fokus, a więc będą działały powiązania klawiatury.

Będzie to działało, nawet jeśli płótno straci ostrość (powiedzmy, wprowadzając tekst w innym widgecie), ponieważ po ponownym włożeniu kursora myszy odzyska fokus.

+1

Ta odpowiedź byłaby bardziej kompletna z fragmentem kodu. –