Почему Tkinter неправильно связывает функцию с событием? - PullRequest
0 голосов
/ 30 мая 2019

Я делаю простую программу на Python 3, используя Tkinter. Мы начинаем с черного холста в полноэкранном окне tkinter, и я хочу показать синий круг в середине холста, когда я нажимаю клавишу пробела на клавиатуре.

Я попробовал этот код:

from tkinter import *

class TheBlueCircle:
    def __init__(self, master):
        self.master = master
        self.ws = master.winfo_screenwidth()
        self.hs = master.winfo_screenheight()
        self.master.geometry(str(self.ws)+'x'+str(self.ws)+'+0+0')
        self.canvas = Canvas(master, bg = 'black')
        self.canvas.pack(fill = BOTH, expand = True)
        self.canvas.bind('<KeyPress-space>', self.drawCircle)

    def drawCircle(self):
        r = min(self.ws, self.hs)/3
        coord = (self.ws/2-r, self.hs/2-r, self.ws/2+r, self.hs/2+r)
        self.canvas.create_oval(coord, fill = 'blue')

root = Tk()
TheBlueCircle(root)
root.mainloop()

Но это не работает. Независимо от того, сколько раз я нажимаю пробел. Нельзя применять функцию drawCircle.

Что не так?

1 Ответ

1 голос
/ 30 мая 2019

В вашем коде необходимо внести некоторые изменения. Сначала вам нужно взять event в качестве аргумента для вашего drawCircle метода. Во-вторых, текущий фокус не установлен на объект canvas.

Чтобы ваш метод правильно выполнялся при закладке space, либо сначала нажмите tab при запуске графического интерфейса, либо принудительно измените фокус в вашем коде:

class TheBlueCircle:
    def __init__(self, master):
        ...
        self.canvas.bind('<space>', self.drawCircle)
        self.canvas.focus_set()

    def drawCircle(self,event=None):
        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...