2014-11-30 13 views
11

Zrozumiałem, że naciśnięcia klawisza TK i zdarzenia keyrelease miały być uruchamiane tylko po naciśnięciu lub zwolnieniu klawisza?TKInter keypress, keyrelease events

Jednak z poniższym prostym kodem, jeśli przytrzymam klawisz "a", otrzymuję ciągłą sekwencję naprzemiennych zdarzeń keypress/keyrelease.

Czy robię coś nie tak, czy jest to bug TkInter? To jest Python2.7 na mennicy Linux.

from Tkinter import * 
def keyup(e): 
    print 'up', e.char 
def keydown(e): 
    print 'down', e.char 

root = Tk() 
frame = Frame(root, width=100, height=100) 
frame.bind("<KeyPress>", keydown) 
frame.bind("<KeyRelease>", keyup) 
frame.pack() 
frame.focus_set() 
root.mainloop() 

Wyjście po naciśnięciu i przytrzymaniu "A":

down a 
up a 
down a 
up a 
down a 
up a 
down a 
up a 
etc... 

Odpowiedz

12

Ok trochę więcej badań stwierdzono this helpful post który pokazuje to ma miejsce z powodu zachowania X. autorepeat. Możesz wyłączyć tę funkcję, korzystając z , a następnie zresetować ją, używając "on" na końcu skryptu. Problem polega na tym, że jest to zachowanie globalne - nie tylko mój skrypt - który nie jest świetny, więc mam nadzieję, że ktoś może wymyślić lepszy sposób.

3

Zachowanie w trybie automatycznym zależy od systemu. W Win7:

down a 
down a 
down a 
... 
down a 
up a 

Jest to mniej niż sekunda.

0

co powiecie;

from Tkinter import * 

wn = Tk() 
wn.title('KeyDetect') 

m = 0 

def down(e): 
    if m == 0: 
     print 'Down\n', e.char, '\n', e 
     global m 
     m = 1 

def up(e): 
    if m == 1: 
     print 'Up\n', e.char, '\n', e 
     global m 
     m = 0 

wn.bind('<KeyPress>', down) 
wn.bind('<KeyRelease>', up) 

wn.mainloop() 

teraz się nie powtórzy.