如何修复TypeError: paint()缺少2个必需位置参数:event和window
问题分析与解决
你的代码存在三个关键错误,直接导致了这个TypeError:
事件绑定方式错误
你写的canvas.bind('<B1-Motion>', paint())中,paint()会立即执行函数,而非将函数作为回调传递给bind方法。正确写法是去掉括号,仅传递函数名:canvas.bind('<B1-Motion>', paint)回调函数参数冗余
Tkinter的事件回调函数默认仅接收event一个参数,不需要额外的window参数。而且你需要绘制圆形的对象是canvas而非window,函数内应该调用canvas.create_oval方法。颜色值未加引号
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
相关产品推荐
相关产品推荐

