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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:15:02