2014-01-20 114 views
2

這是我的GUI代碼:類型錯誤:__init __()至少需要3個參數(1給出)

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() 

我3號最後一行frame = MainWindow()得到

TypeError:: __init__() takes at least 3 arguments (1 given) 

如何確保參數列表匹配?我想我對傳遞自我,父母或其他事情有點困惑。

請幫忙!

編輯:@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 *' 

回答

1

您將init設置爲接受3個值,然後您不會傳遞任何內容。因爲這個框架將是一個頂層窗口,你可以通過它無的家長和某種標題字符串:

frame = MainWindow(None, "test") 

下一個問題是,您嘗試使用這兩種初始化程序:超和常規。你只能使用其中一種,但不能同時使用!我離開了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() 
0

MainWindow聲明:

def __init__(self, parent, title, *args, **kwargs): 

self當y OU實例化類,但是你需要通過parenttitle到您的通話MainWindow()

frame = MainWindow(app, 'Window Title') # i'm not sure if app is right for parent, but i assume it is 

可以忽略*args**kwargs,因爲通過閱讀他們根本不使用的功能__init__ ...

+0

@Bhavika它看起來像我aws錯了什麼'父'的需要。它說它需要是另一個'wxWindow'。這就是我所知道的,對不起。也許別人有這個新問題的答案。 – mhlester

+0

是的,我嘗試了你所說的,但它沒有奏效。看到下面的解決方案! – boltthrower

+0

@Bhavika,太棒了!很高興有人知道他們在做什麼。 – mhlester

相關問題