运行wxPython程序时为何出现“__init__()需1个位置参数但传入2个”错误?
问题:wxPython计算器程序启动报错解决
我是Python新手,想制作一个带GUI的个人用计算器。参考wxPython入门教程编写了程序,但运行时立即报错,请求帮助。
程序代码
import wx class Frame(wx.Frame): def __init__(self, *args, **kwargs): super(Frame, self).__init__(*args, **kwargs) self.CalcUI() def __init__(self): super().__init__(parent=None, title='AlarmApp') panel = wx.Panel(self) self.text_ctrl = wx.TextCtrl(panel, pos=(5, 5)) my_btn = wx.Button(panel, label='Create Alarm', pos=(5, 55)) self.Show() def CalcUI(self): menubar = wx.MenuBar() file = wx.Menu() fileItem = fileMenu.Append(wx.ID_EXIT, 'Quit', 'Quit Application') menubar.Append(file, '&File') self.setMenuBar(menubar) self.Bind(wx.EVT_MENU, self.OnQuit, fileItem) self.SetSize((200,100)) self.SetTitle('Menu') self.Centre() def OnQuit(self, e): self.Close() def main(): app = wx.App() ex = Frame(None) ex.Show() app.MainLoop() if __name__ == '__main__': main()
报错信息
Traceback (most recent call last): File "C:\Users\adam\Documents\Adam\Python\time.py", line 39, in <module> main() File "C:\Users\adam\Documents\Adam\Python\time.py", line 34, in main ex = Frame(None) TypeError: Frame.__init__() takes 1 positional argument but 2 were given
问题分析与修正
核心错误点
- 重复定义
__init__方法:类中存在两个__init__,Python会以最后定义的为准,导致调用Frame(None)时,实际触发的是无参数的__init__,直接引发参数不匹配错误。 - 变量名不匹配:
CalcUI方法里定义的菜单变量是file,但调用时写成了fileMenu.Append,会触发未定义变量错误。 - API方法名大小写错误:wxPython采用驼峰命名规范,
self.setMenuBar需改为self.SetMenuBar。 - 冗余的窗口显示调用:
__init__中的self.Show()和main函数里的ex.Show()重复,保留一处即可。
修正后的完整代码
import wx class Frame(wx.Frame): def __init__(self, *args, **kwargs): super(Frame, self).__init__(*args, **kwargs) # 合并初始化逻辑,统一创建面板和控件 panel = wx.Panel(self) self.text_ctrl = wx.TextCtrl(panel, pos=(5, 5), size=(280, 30)) my_btn = wx.Button(panel, label='计算', pos=(5, 45)) self.CalcUI() def CalcUI(self): menubar = wx.MenuBar() file_menu = wx.Menu() file_item = file_menu.Append(wx.ID_EXIT, '退出', '退出计算器') menubar.Append(file_menu, '&文件') self.SetMenuBar(menubar) self.Bind(wx.EVT_MENU, self.OnQuit, file_item) self.SetSize((300, 200)) self.SetTitle('个人计算器') self.Centre() def OnQuit(self, e): self.Close() def main(): app = wx.App() ex = Frame(None, title='个人计算器') ex.Show() app.MainLoop() if __name__ == '__main__': main()
内容的提问来源于stack exchange,提问作者mandala
相关产品推荐
相关产品推荐

