Python中TypeError: __init__()缺失必填参数'master'问题咨询
问题分析与修复
你遇到的__init__() missing 1 required positional argument: 'master'错误,根源是按钮点击时直接调用mulai类但没有传入必需的master参数,同时代码里还有其他几个拼写和逻辑错误,我来逐个拆解:
核心错误:command绑定错误
在minigame类的按钮定义中:
self.b4=Button(self.master,text="start",command=mulai)
这里直接把mulai类名赋值给command,点击按钮时Python会尝试执行mulai(),但mulai的__init__方法要求必须传入master参数,自然会报错。
修复方法:用lambda表达式包装,传入当前的master:
self.b4=Button(self.master,text="start",command=lambda: mulai(self.master))
其他代码错误与修复
1. 拼写错误导致的属性引用失败
在mulai类的asal方法里:
self.masteer.withdraw() # 拼写错误:masteer → win
你初始化时把传入的master赋值给了self.win,所以应该改成:
self.win.withdraw()
2. 方法参数不匹配
你在asal里调用self.radi(self.tk),但radi方法没有定义参数,导致调用报错。需要给radi添加parent参数(接收传入的Toplevel窗口):
def radi(self, parent): # 后续控件都使用parent作为父容器
3. IntVar的初始化与引用错误
start方法里的str(var.get())应该改为str(self.var.get()),因为var是实例属性self.var,不是局部变量;radi方法里的var=self.start是错误的,应该先初始化self.var = IntVar(),再绑定到Radiobutton;
4. 控件父容器错误
radi方法里的Radiobutton和Label都错误地使用了self.master,但mulai类中并没有定义self.master,应该使用传入的parent(也就是我们创建的Toplevel窗口)。
完整修正后的代码
from tkinter import* class minigame(): def __init__(self,master): self.master=master self.master.title("try") self.lbl1=Label(self.master) self.lbl1['text']="User Name" self.lbl1.grid(row=1,column=1) self.txt1=Entry(self.master) self.txt1['width']=30 self.txt1.grid(row=1,column=2) # 修复command绑定问题 self.b4=Button(self.master,text="start",command=lambda: mulai(self.master)) self.b4.grid(row=2,column=2) class mulai(): def __init__(self,master): self.win=master self.win.title('MINIGAME') self.asal() def asal(self): # 拼写修复:masteer → win self.win.withdraw() self.tk=Toplevel(self.win) # 传入Toplevel窗口给radi方法 self.radi(self.tk) def start(self): # 引用实例属性self.var self.pilihan="Anda Menjawab " + str(self.var.get()) # 可以添加打印或者显示逻辑,比如: print(self.pilihan) def radi(self, parent): # 初始化IntVar作为实例属性 self.var=IntVar() # 使用parent作为父容器,绑定self.var rb1=Radiobutton(parent,text="Martha",variable=self.var,value=0,command=self.start) rb1.grid(row=1) rb2=Radiobutton(parent,text="Kula Diamond",variable=self.var,value=1,command=self.start) rb2.grid(row=2) self.label=Label(parent,text="WHO IS THE BEST WAIFU?") self.label.grid(row=0) if __name__ == '__main__': root=Tk() app=minigame(root) root.mainloop() # 补充主循环,避免窗口一闪而过
内容的提问来源于stack exchange,提问作者Yen Fei
相关产品推荐
相关产品推荐

