2013-04-01 6 views
7

Sto lavorando a un progetto in python e ho creato un metodo per disegnare una cosa specifica in tkinter. Lo voglio in modo che ogni volta che premo la barra spaziatrice, l'immagine si ridisegna da sola (eseguire nuovamente il metodo perché ho codificato il metodo in modo che possa ridisegnarsi su se stesso). In che modo esattamente legherei la barra spaziatrice al metodo in modo che il programma esegua, disegna e ridisegna se premo la barra spaziatrice?Come associare la chiave della barra spaziatrice a un determinato metodo in tkinter (python)

per esempio, lo voglio in modo che ogni volta che si preme lo spazio, il programma disegna in una posizione casuale sulla tela:

from Tkinter import * 
from random import * 

root=Tk() 
canvas=Canvas(root,width=400,height=300,bg='white') 
def draw(): 
    canvas.delete(ALL)# clear canvas first 
    canvas.create_oval(randint(0,399),randint(0,299),15,15,fill='red') 
draw() 
canvas.pack() 
root.mainloop() 

come faccio a legare la barra spaziatrice per il metodo?

risposta

9
from Tkinter import * 
from random import * 

root=Tk() 
canvas=Canvas(root,width=400,height=300,bg='white') 
def draw(event=None): 
    canvas.delete(ALL)# clear canvas first 
    canvas.create_oval(randint(0,399),randint(0,299),15,15,fill='red') 
draw() 
canvas.pack() 

root.bind("<space>", draw) 
root.mainloop() 
+0

grazie mille! Ho guardato altre domande ma non ho trovato nulla di simile a ciò di cui avevo bisogno. Suppongo che aggiungere l'evento = Nessuna sia importante. –

+0

felice di aiutare. sì, la funzione di callback è chiamata da Tkinter con un parametro, quindi ha bisogno di qualcosa da passare. E impostandola su None puoi chiamarla nella riga 9 senza passare nulla dentro. – twasbrillig

1

Si potrebbe fare qualcosa di simile:

from Tkinter import * 
from random import * 

root=Tk() 
canvas=Canvas(root,width=400,height=300,bg='white') 

def draw(event): 
    if event.char == ' ': 
     canvas.delete(ALL)# clear canvas first 
     canvas.create_oval(randint(0,399),randint(0,299),15,15,fill='red') 

root.bind('<Key>', draw) 

canvas.pack() 
root.mainloop() 

In sostanza, si associa la funzione di disegno a qualche elemento di livello superiore per la rilegatura <Key> che si attiva ogni volta che si preme un tasto sulla tastiera. Quindi, l'oggetto evento passato ha un membro char che contiene una stringa che rappresenta il tasto premuto sulla tastiera.

L'evento verrà attivato solo quando l'oggetto a cui è associato ha lo stato attivo, motivo per cui sto vincolando il metodo draw all'oggetto root, poiché questo sarà sempre a fuoco.

+0

perché scegliere di eseguire il binding su "" anziché ""? Sembra che tu stia facendo più lavoro per te stesso –

+0

@BryanOakley Sì, non mi ero reso conto che '' esisteva fino a dopo aver visto l'altra risposta. Lascio la mia risposta nel caso sia utile, ma ho svalutato l'altra risposta. – Michael0x2a

0

È possibile aslo uso canvas.bind_all("<space>", yourFunction) che ascolterà per gli eventi in tutta l'applicazione e non solo dei widget.