2013-04-01 11 views
7

Pracuję nad projektem w Pythonie, a ja stworzyłem metodę rysowania konkretnej rzeczy w tkinter. Chcę, aby za każdym razem, gdy naciskałem klawisz spacji, obraz sam się przerysuje (ponownie uruchomić metodę, ponieważ zakodowałem metodę, aby mogła przerysować się samemu). Jak dokładnie powinienem związać spację z metodą, aby program działał, rysował i ponownie rysował, gdybym nacisnął spację?Jak powiązać klawisz spacji z pewną metodą w tkinter (python)

na przykład, chcę go tak, że gdy nacisnę miejsca, program rysuje w losowym miejscu na płótnie:

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

jaki sposób wiążę spacji do metody?

Odpowiedz

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

Dziękuję bardzo! Spojrzałem na inne pytania, ale nie mogłem znaleźć czegoś podobnego do tego, czego potrzebowałem. Przypuszczam, że dodanie zdarzenia = Brak było ważne. –

+0

zadowolony z pomocy. tak, funkcja wywołania zwrotnego jest wywoływana przez Tkinter z parametrem, więc potrzebuje czegoś, co należy przekazać. A ustawiając ją na None, możesz wywołać ją w linii 9 bez przekazywania czegokolwiek. – twasbrillig

1

Można zrobić coś takiego:

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

Zasadniczo, można związać swoją funkcję rysowania do jakiegoś elementu do wiązania <Key> najwyższego poziomu, który jest wyzwalane, gdy dowolny klawisz na klawiaturze jest wciśnięty. Następnie obiekt zdarzenia, który został przekazany ma element char, który zawiera ciąg reprezentujący klawisz naciśnięty na klawiaturze.

Zdarzenie zostanie wywołane tylko wtedy, gdy obiekt, do którego się przyzwyczaił, ustawi ostrość, dlatego wiążę metodę draw z obiektem root, ponieważ to zawsze będzie ostre.

+0

dlaczego zdecydujesz się na bindowanie na '' zamiast ''? Wygląda na to, że robisz więcej pracy dla siebie –

+0

@BryanOakley Tak, nie zdawałem sobie sprawy, że '' istniało, dopóki nie zobaczyłem drugiej odpowiedzi. Zostawiam moją odpowiedź na wypadek, gdyby była przydatna, ale przegłosowałem drugą odpowiedź. – Michael0x2a

0

Można aslo korzystanie canvas.bind_all("<space>", yourFunction) To będzie nasłuchiwał wydarzeń w całej aplikacji i nie tylko na widget.

Powiązane problemy