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

如何修复TypeError: paint()缺少2个必需位置参数:event和window

问题分析与解决

你的代码存在三个关键错误,直接导致了这个TypeError:

  1. 事件绑定方式错误
    你写的canvas.bind('<B1-Motion>', paint())中,paint()会立即执行函数,而非将函数作为回调传递给bind方法。正确写法是去掉括号,仅传递函数名:canvas.bind('<B1-Motion>', paint)

  2. 回调函数参数冗余
    Tkinter的事件回调函数默认仅接收event一个参数,不需要额外的window参数。而且你需要绘制圆形的对象是canvas而非window,函数内应该调用canvas.create_oval方法。

  3. 颜色值未加引号
    fill = black中的black未用引号包裹,会被Python当作变量查找,引发NameError,需改为fill='black'

另外,你重复导入了tkinter的内容,from tkinter import *已经包含了Tk和Canvas,后续的from tkinter import Tk和from tkinter import Canvas as c可以删除以避免冗余。

修正后的完整代码

from tkinter import *

window = Tk()
window.configure(background="grey")
window.title("Canvas - Draw Shapes")

f_top = Frame(window)
f_bot = Frame(window)
f_top.pack()
f_bot.pack()

# elements
button_1 = Button(f_bot, text='Левая кнопка')
button_2 = Button(f_bot, text='Правая кнопка')
button_1.pack(side=LEFT)
button_2.pack(side=LEFT)

# setting up the canvas
canvas = Canvas(f_top, width=500, height=300, bg="white")
canvas.pack(expand=YES, fill=BOTH)

def paint(event):
    x1, y1 = (event.x - 4), (event.y - 4)
    x2, y2 = (event.x + 4), (event.y + 4)
    canvas.create_oval(x1, y1, x2, y2, fill='black')

canvas.bind('<B1-Motion>', paint)
window.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:50:27