Как привязать клавишу пробела к определенному методу в tkinter (python)

Я работаю над проектом в python, и я сделал метод для рисования конкретной вещи в tkinter. Я хочу, чтобы всякий раз, когда я нажимаю пробел, изображение будет перерисовываться (запустите метод снова, потому что я закодировал метод, чтобы он мог перерисовать себя). Как именно я привязал бы пробел к методу, чтобы программа запускалась, рисовала и повторно рисовала, если бы я нажал пробел?

например, я хочу, чтобы всякий раз, когда я нажимаю пробел, программа рисует случайное расположение на холсте:

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

Как привязать пробел к методу?

3 ответов


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

вы могли бы сделать что-то вроде этого:

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

в основном, вы привязываете свою функцию рисования к некоторому элементу верхнего уровня к <Key> привязка, которая запускается при нажатии клавиши на клавиатуре. Затем объект события, который передается, имеет char элемент, содержащий строку, представляющую клавишу, которая была нажата на клавиатуре.

событие будет запускаться только тогда, когда объект, к которому он привязан, имеет фокус, поэтому я связываю draw метод root объект, так как это всегда будет в фокусе.


вы можете также использовать canvas.bind_all("<space>", yourFunction) Это будет слушать события во всем приложении, а не только на виджете.