这是我的GUI代码:
import wx
import os.path
class MainWindow(wx.Frame):
#def __init__(self, filename=''):
#super(MainWindow, self).__init__(None, size=(800,600))
def __init__(self, parent, title, *args, **kwargs):
super(MainWindow,self).__init__(parent, title = title, size = (800,600))
wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 800,608 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )
grid = wx.GridSizer( 2, 2, 0, 0 )
self.filename = filename
self.dirname = '.'
self.CreateInteriorWindowComponents()
self.CreateExteriorWindowComponents()
def CreateInteriorWindowComponents(self):
staticbox = wx.StaticBoxSizer( wx.StaticBox( self, wx.ID_ANY, u"Enter text" ), wx.VERTICAL )
staticbox.Add( self.m_textCtrl1, 0, wx.ALL|wx.EXPAND, 5 )
self.m_textCtrl1 = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( -1,250 ), wx.TE_MULTILINE)
self.m_textCtrl1.SetMaxLength(10000)
self.Submit = wx.Button( self, wx.ID_ANY, u"Submit", wx.DefaultPosition, wx.DefaultSize, 0 )
staticbox.Add( self.Submit, 0, wx.ALL, 5 )
def CreateExteriorWindowComponents(self):
''' Create "exterior" window components, such as menu and status
bar. '''
self.CreateMenu()
self.CreateStatusBar()
self.SetTitle()
def CreateMenu(self):
fileMenu = wx.Menu()
for id, label, helpText, handler in \
[(wx.ID_ABOUT, '&About', 'Storyteller 1.0 -',
self.OnAbout),
(wx.ID_OPEN, '&Open', 'Open a new file', self.OnOpen),
(wx.ID_SAVE, '&Save', 'Save the current file', self.OnSave),
(wx.ID_SAVEAS, 'Save &As', 'Save the file under a different name',
self.OnSaveAs),
(None, None, None, None),
(wx.ID_EXIT, 'E&xit', 'Terminate the program', self.OnExit)]:
if id == None:
fileMenu.AppendSeparator()
else:
item = fileMenu.Append(id, label, helpText)
self.Bind(wx.EVT_MENU, handler, item)
menuBar = wx.MenuBar()
menuBar.Append(fileMenu, '&File') # Add the fileMenu to the MenuBar
self.SetMenuBar(menuBar) # Add the menuBar to the Frame
def SetTitle(self):
# MainWindow.SetTitle overrides wx.Frame.SetTitle, so we have to
# call it using super:
super(MainWindow, self).SetTitle('Editor %s'%self.filename)
# Helper methods:
def defaultFileDialogOptions(self):
''' Return a dictionary with file dialog options that can be
used in both the save file dialog as well as in the open
file dialog. '''
return dict(message='Choose a file', defaultDir=self.dirname,
wildcard='*.*')
def askUserForFilename(self, **dialogOptions):
dialog = wx.FileDialog(self, **dialogOptions)
if dialog.ShowModal() == wx.ID_OK:
userProvidedFilename = True
self.filename = dialog.GetFilename()
self.dirname = dialog.GetDirectory()
self.SetTitle() # Update the window title with the new filename
else:
userProvidedFilename = False
dialog.Destroy()
return userProvidedFilename
# Event handlers:
def OnAbout(self, event):
dialog = wx.MessageDialog(self, 'A sample editor\n'
'in wxPython', 'About Sample Editor', wx.OK)
dialog.ShowModal()
dialog.Destroy()
def OnExit(self, event):
self.Close() # Close the main window.
def OnSave(self, event):
textfile = open(os.path.join(self.dirname, self.filename), 'w')
textfile.write(self.control.GetValue())
textfile.close()
def OnOpen(self, event):
if self.askUserForFilename(style=wx.OPEN,
**self.defaultFileDialogOptions()):
textfile = open(os.path.join(self.dirname, self.filename), 'r')
self.control.SetValue(textfile.read())
textfile.close()
def OnSaveAs(self, event):
if self.askUserForFilename(defaultFile=self.filename, style=wx.SAVE,
**self.defaultFileDialogOptions()):
self.OnSave(event)
app = wx.App()
frame = MainWindow()
frame.Show()
app.MainLoop()
我正在
TypeError:: __init__() takes at least 3 arguments (1 given)
在最后一行frame = MainWindow()
如何确保参数列表匹配?我认为我在传递自我,父母或其他方面有点困惑。
请帮忙!
编辑:@mhlester:我做了你建议的改变,但现在我有一个不同的错误:
TypeError: in method 'new_Frame', expected argument 1 of type 'wxWindow *'
事实上,这就是完整文本的样子:
Traceback (most recent call last):
File "C:\Users\BT\Desktop\BEt\gui2.py", line 115, in <module>
frame = MainWindow(app,'Storyteller')
File "C:\Users\BT\Desktop\BE\gui2.py", line 9, in __init__
super(MainWindow,self).__init__(parent, title = title, size = (800,600))
File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\_windows.py", line 580, in __init__
_windows_.Frame_swiginit(self,_windows_.new_Frame(*args, **kwargs))
TypeError: in method 'new_Frame', expected argument 1 of type 'wxWindow *'
答案 0 :(得分:1)
您将init设置为接受3个值,然后您不会传递任何内容。因为此框架将是顶级窗口,所以您可以将其传递给None的父级和某种标题字符串:
frame = MainWindow(None, "test")
下一个问题是你尝试使用两个初始化例程:super和regular。你只能使用其中一个,但不能同时使用两个!我完整地保留了 super ,因为它更短并且注释了后者。我还将 self.filename 更改为空字符串,因为“文件名”显然没有定义,我注释掉了构建其他小部件的调用,因为代码不完整。
import wx
import os.path
class MainWindow(wx.Frame):
def __init__(self, parent, title, *args, **kwargs):
super(MainWindow,self).__init__(parent, title = title, size = (800,600))
#wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 800,608 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )
grid = wx.GridSizer( 2, 2, 0, 0 )
self.filename = ""
self.dirname = '.'
#self.CreateInteriorWindowComponents()
#self.CreateExteriorWindowComponents()
def CreateInteriorWindowComponents(self):
staticbox = wx.StaticBoxSizer( wx.StaticBox( self, wx.ID_ANY, u"Enter text" ), wx.VERTICAL )
staticbox.Add( self.m_textCtrl1, 0, wx.ALL|wx.EXPAND, 5 )
self.m_textCtrl1 = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( -1,250 ), wx.TE_MULTILINE)
self.m_textCtrl1.SetMaxLength(10000)
self.Submit = wx.Button( self, wx.ID_ANY, u"Submit", wx.DefaultPosition, wx.DefaultSize, 0 )
staticbox.Add( self.Submit, 0, wx.ALL, 5 )
def CreateExteriorWindowComponents(self):
''' Create "exterior" window components, such as menu and status
bar. '''
self.CreateMenu()
self.CreateStatusBar()
self.SetTitle()
def CreateMenu(self):
fileMenu = wx.Menu()
for id, label, helpText, handler in \
[(wx.ID_ABOUT, '&About', 'Storyteller 1.0 -',
self.OnAbout),
(wx.ID_OPEN, '&Open', 'Open a new file', self.OnOpen),
(wx.ID_SAVE, '&Save', 'Save the current file', self.OnSave),
(wx.ID_SAVEAS, 'Save &As', 'Save the file under a different name',
self.OnSaveAs),
(None, None, None, None),
(wx.ID_EXIT, 'E&xit', 'Terminate the program', self.OnExit)]:
if id == None:
fileMenu.AppendSeparator()
else:
item = fileMenu.Append(id, label, helpText)
self.Bind(wx.EVT_MENU, handler, item)
menuBar = wx.MenuBar()
menuBar.Append(fileMenu, '&File') # Add the fileMenu to the MenuBar
self.SetMenuBar(menuBar) # Add the menuBar to the Frame
def SetTitle(self):
# MainWindow.SetTitle overrides wx.Frame.SetTitle, so we have to
# call it using super:
super(MainWindow, self).SetTitle('Editor %s'%self.filename)
# Helper methods:
def defaultFileDialogOptions(self):
''' Return a dictionary with file dialog options that can be
used in both the save file dialog as well as in the open
file dialog. '''
return dict(message='Choose a file', defaultDir=self.dirname,
wildcard='*.*')
def askUserForFilename(self, **dialogOptions):
dialog = wx.FileDialog(self, **dialogOptions)
if dialog.ShowModal() == wx.ID_OK:
userProvidedFilename = True
self.filename = dialog.GetFilename()
self.dirname = dialog.GetDirectory()
self.SetTitle() # Update the window title with the new filename
else:
userProvidedFilename = False
dialog.Destroy()
return userProvidedFilename
# Event handlers:
def OnAbout(self, event):
dialog = wx.MessageDialog(self, 'A sample editor\n'
'in wxPython', 'About Sample Editor', wx.OK)
dialog.ShowModal()
dialog.Destroy()
def OnExit(self, event):
self.Close() # Close the main window.
def OnSave(self, event):
textfile = open(os.path.join(self.dirname, self.filename), 'w')
textfile.write(self.control.GetValue())
textfile.close()
def OnOpen(self, event):
if self.askUserForFilename(style=wx.OPEN,
**self.defaultFileDialogOptions()):
textfile = open(os.path.join(self.dirname, self.filename), 'r')
self.control.SetValue(textfile.read())
textfile.close()
def OnSaveAs(self, event):
if self.askUserForFilename(defaultFile=self.filename, style=wx.SAVE,
**self.defaultFileDialogOptions()):
self.OnSave(event)
app = wx.App()
frame = MainWindow(None, "test")
frame.Show()
app.MainLoop()
答案 1 :(得分:0)
来自MainWindow
声明:
def __init__(self, parent, title, *args, **kwargs):
实例化课程时, self
会自动通过,但您需要将parent
和title
传递给MainWindow()
来电:
frame = MainWindow(app, 'Window Title') # i'm not sure if app is right for parent, but i assume it is
您可以忽略*args
和**kwargs
,因为通过__init__
功能阅读它们根本就没用过......