Tkinter运行报错TypeError: PNI()缺少必需位置参数'self'求解决
问题根因
你遇到的TypeError: PNI() missing 1 required positional argument: 'self'报错由两个错误写法共同导致:
- 你把
PNI定义为StartPage类__init__方法内的嵌套函数,该场景下不需要额外声明self参数,嵌套函数可以直接访问外层__init__方法的self实例对象 - Tkinter的
Button组件command参数绑定的回调函数,触发时默认不会传入任何参数,你给PNI定义了必填的self参数,调用时没有传参就会触发参数缺失报错
可行解决方案
直接修改StartPage类中PNI函数的定义,删除冗余的self参数即可,修改后的StartPage类代码如下:
class StartPage(Frame): def __init__(self, parent, controller, *args, **kwargs): Frame.__init__(self, parent) # 创建输入框 pni = Entry(self, width=50) pni.insert(0, 'Enter project number') # 移除PNI函数的self参数即可 def PNI(*args, **kwargs): label1 = Label(self, text = pni.get()) label1.grid(row=0, column=2) # 创建提交按钮 buttonpni = Button(self, text="Submit", command=PNI) # 布局排版 pni.grid(row=0, column=0) buttonpni.grid(row=1, column=0)
如果后续业务需要把PNI提取为StartPage类的公共实例方法,可以用lambda包装一层传参,示例写法:
class StartPage(Frame): def __init__(self, parent, controller, *args, **kwargs): Frame.__init__(self, parent) # 把输入框设为实例属性方便方法调用 self.pni = Entry(self, width=50) self.pni.insert(0, 'Enter project number') # 绑定实例方法时用lambda包装传递self buttonpni = Button(self, text="Submit", command=lambda: self.PNI()) self.pni.grid(row=0, column=0) buttonpni.grid(row=1, column=0) # 定义为类实例方法 def PNI(self): label1 = Label(self, text = self.pni.get()) label1.grid(row=0, column=2)
两种方案都可以正常运行,点击Submit按钮后会把输入框的内容展示在右侧区域。
内容的提问来源于stack exchange,提问作者masterzack4
相关产品推荐
相关产品推荐

