You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Tkinter鼠标左键绑定失效,报TypeError错误求助

解决Tkinter绑定鼠标左键时的TypeError问题

嘿,我来帮你搞定这个报错!你遇到的TypeError: delete() takes 0 positional arguments but 1 was given问题,根源其实很简单——Tkinter的事件绑定函数会自动传递一个事件对象参数,但你的delete()函数没准备接收它。

问题原因

当你用canvas.bind('<Button-1>', delete)把鼠标左键点击事件绑定到delete函数时,每次点击左键,Tkinter都会把一个包含点击细节(比如点击坐标)的事件对象作为参数传给delete,但你定义的delete()没有任何参数,自然就会触发类型错误啦。

修复步骤

  1. 给delete函数添加一个参数(比如event),哪怕你用不到这个参数也得加上:
    def delete(event):
        canvas.delete("all")
        global a  # 别忘了声明a是全局变量
        a=0
        setric()
    
  2. 另外,你的代码里a变量在setric里用了global,但一开始没初始化,运行时可能会触发NameError,所以要在全局作用域里先给a赋值:
    a = 0  # 全局初始化变量a
    
  3. 最后别忘了加上tkinter.mainloop(),不然你的屏保程序运行后会立刻退出,看不到效果。

完整修复后的代码

import tkinter
from random import *

canvas=tkinter.Canvas(width=1000,height=800)
canvas.pack()

entry1=tkinter.Entry()
entry1.pack()

a = 0  # 全局初始化变量a

def setric():
    global a
    x=randrange(900)
    y=randrange(700)
    canvas.delete('all')
    farba=choice(("red","purple","blue","lightblue","green","lightgreen"))
    if a>-90:
        a=a-10
    else:
        a=-10
    if entry1.get()=="":
        canvas.update()
        canvas.after(3000,setric)
        a=0
    else:
        canvas.create_text(x,y,text=entry1.get(),font="Arial 40",fill=farba,angle=a)
        canvas.after(2000, setric)

def delete(event):
    global a
    canvas.delete("all")
    a=0
    setric()

canvas.bind('<Button-1>',delete)
tkinter.mainloop()

额外小提醒

Tkinter所有绑定事件的回调函数,都必须接受至少一个参数(事件对象),这是框架的固定规则哦~以后绑定键盘、鼠标这类事件时,都要记得给回调函数留一个参数位置。

内容的提问来源于stack exchange,提问作者Jozef Vitko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:06:45