Python Tkinter函数自己调用

Python Tkinter函数自己调用,python,tkinter,graphics,Python,Tkinter,Graphics,使用tkinter,我试图使一个球出现在屏幕上,然后在单击“w”键时消失(与背景颜色相同),但在运行程序时它会立即消失 我认为这可能是由于代码的结构,函数ball\u在变量之前消失了,但当我把函数放在它下面时,我没有注意到有什么不同。这是密码 from tkinter import * root = Tk() height = 700 width = 1000 canvas = Canvas(width=width, height=height) canvas_background = '#

使用
tkinter
,我试图使一个球出现在屏幕上,然后在单击“w”键时消失(与背景颜色相同),但在运行程序时它会立即消失

我认为这可能是由于代码的结构,函数
ball\u在变量之前消失了
,但当我把函数放在它下面时,我没有注意到有什么不同。这是密码

from tkinter import *

root = Tk()

height = 700
width = 1000
canvas = Canvas(width=width, height=height)
canvas_background = '#63fff9'
canvas.configure(background=canvas_background)
root.title = "Ball Bouncer Tk"

def ball_disappear():
    canvas.itemconfig(ball, fill=canvas_background, outline=canvas_background)
    canvas.update()

ballP1 = 400
ballP2 = 400
ballP3 = 600
ballP4 = 600

ball = canvas.create_oval(ballP1, ballP2, ballP3, ballP4, fill='#000000', tags="ball")

canvas.pack()
canvas.bind("w", ball_disappear())
canvas.mainloop()

考虑这一行代码:

canvas.bind("w", ball_disappear())
它的效果与此完全相同:

result = ball_disappear()
canvas.bind("w", result)
绑定事件时,必须为其提供可调用的。通常采用函数引用的形式,但也可以是调用
lambda
functools.partial
的结果,如果该函数返回另一个函数,甚至可以是您自己的函数

因此,绑定球的正确方法如下所示:

canvas.bind("w", ball_disappear)
但是,由于代码中的另外两个错误,您的代码仍然无法工作

首先,默认情况下画布不获取键盘事件。您必须明确赋予它键盘焦点,因此在创建画布后,您需要执行以下操作:

canvas.focus_set()
其次,将函数绑定到事件时,调用的函数将被传递一个包含事件信息的对象。因此,即使您不打算在代码中使用参数,也需要按如下方式定义函数:

def ball_disappear(event):

canvas.bind(…)
中的
ball\u define()
更改为
ball\u define
。执行此操作时,单击“w”不会使球变成背景。