为什么Tkinter无法将函数正确绑定到事件?

时间:2019-05-30 01:05:48

标签: python events tkinter binding

我正在使用Tkinter在Python 3中编写一个简单的程序。我们从全屏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 个答案:

答案 0 :(得分:1)

您的代码中需要进行一些更改。首先,您需要为event方法使用一个drawCircle作为参数。其次,当前焦点未设置为canvas对象。

要在按space后正确执行方法,请在启动GUI时先按tab,或在代码中强制更改焦点:

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

    def drawCircle(self,event=None):
        ...