2013-04-01 7 views
7

Ich arbeite an einem Projekt in Python, und ich habe eine Methode erstellt, um eine bestimmte Sache in Tkinter zu zeichnen. Ich möchte es so, dass, wenn ich die Leertaste drücke, das Bild sich selbst neu zeichnen (führen Sie die Methode erneut aus, da ich die Methode so codiert habe, dass sie über sich selbst neu zeichnen konnte). Wie genau würde ich die Leertaste an die Methode binden, so dass das Programm ausgeführt, gezeichnet und neu gezeichnet würde, wenn ich die Leertaste drücke?So binden Sie den SpaceBar-Schlüssel an eine bestimmte Methode in tkinter (Python)

zum Beispiel, ich will es so, dass, wenn ich die Leertaste drücke, zeichnet das Programm in einer zufälligen Stelle auf der Leinwand:

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

wie würde ich die Leertaste, um das Verfahren zu binden?

Antwort

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

Vielen Dank! Ich habe mir andere Fragen angeschaut, aber ich konnte nichts finden, was ich brauchte. Ich denke, das Hinzufügen des Ereignisses = None war wichtig. –

+0

froh zu helfen. Ja, die Callback-Funktion wird von Tkinter mit einem Parameter aufgerufen, so dass etwas übergeben werden muss. Und indem Sie es auf None setzen, können Sie es in Zeile 9 aufrufen, ohne irgendetwas zu übergeben. – twasbrillig

1

Man könnte so etwas tun:

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

Grundsätzlich Sie Ihre Zeichnung Funktion zu einem gewissen Elemente der obersten Ebene an die <Key> Bindung binden, die, wenn eine Taste auf der Tastatur ausgelöst wird, gedrückt wird. Dann hat das Ereignisobjekt, das übergeben wird, ein char Mitglied, das eine Zeichenfolge enthält, die die Taste darstellt, die auf der Tastatur gedrückt wurde.

Das Ereignis wird nur ausgelöst, wenn das Objekt, an das es gebunden ist, den Fokus hat. Deshalb binde ich die Methode draw an das Objekt root, da dieses immer im Fokus ist.

+0

Warum würden Sie sich entscheiden, auf '' statt '' zu binden? Es sieht so aus, als würdest du mehr Arbeit für dich machen. –

+0

@BryanOakley Ja, ich habe nicht bemerkt, dass '' existiert, bis ich die andere Antwort gesehen habe. Ich lasse meine Antwort für den Fall, dass es nützlich ist, aber ich habe die andere Antwort aufgefrischt. – Michael0x2a

0

Sie können Gebrauch machen canvas.bind_all("<space>", yourFunction) Das ist für Ereignisse in der gesamten Anwendung zu hören und nicht nur auf Widget Aslo.

Verwandte Themen