Tkinter函数自行调用

时间:2019-01-01 04:28:34

标签: python tkinter graphics

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

我认为这可能是由于代码的结构所致,函数ball_disappear在变量之前,但是当我将函数放在变量下面时,我没有发现任何区别。这是代码。

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

1 个答案:

答案 0 :(得分:3)

考虑以下代码行:

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

它具有与此完全相同的效果:

result = ball_disappear()
canvas.bind("w", result)

绑定事件时,必须给它一个 callable 。通常,它以对函数的引用的形式出现,尽管它也可能是对lambdafunctools.partial的调用的结果,或者甚至是您自己的函数(如果该函数返回另一个函数)的结果。

因此,绑定ball_disappear的正确方法如下:

canvas.bind("w", ball_disappear)

但是,由于您的代码中还有其他两个错误,您的代码仍然无法使用。

首先,画布默认情况下不获取键盘事件。您必须明确为其指定键盘焦点,因此在创建画布后的某个时候需要执行以下操作:

canvas.focus_set()

第二,当您将函数绑定到事件时,将向调用该函数的对象传递有关事件的信息。因此,即使您不打算在代码中使用参数,也需要像下面那样定义函数:

def ball_disappear(event):