0

私はプログラミングとpythonとwxpythonにかなり慣れていません。私はこのコードを文字通り HOURS で調べ、オンラインでどこでも答えを見つけようとしました。メニュー項目をクリックした後、新しいウィンドウを表示するのに問題があります。これまでの私のコードは次のとおりです...

import wx

class MainWindow(wx.Frame):

    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,'Python Test App',size=(600,400))
        panel=wx.Panel(self)
        wx.Frame.CenterOnScreen(self)
        ##wx.Frame.Maximize(self)

        status=self.CreateStatusBar()
        menubar=wx.MenuBar()
        file_menu=wx.Menu()
        edit_menu=wx.Menu()

        ID_FILE_NEW = 1
        ID_FILE_OPEN = 2

        ID_EDIT_UNDO = 3
        ID_EDIT_REDO = 4


        file_menu.Append(ID_FILE_NEW,"New Window","This is a new window")
        file_menu.Append(ID_FILE_OPEN,"Open...","This will open a new window")

        edit_menu.Append(ID_EDIT_UNDO,"Undo","This will undo your last action")
        edit_menu.Append(ID_EDIT_REDO,"Redo","This will redo your last undo")


        menubar.Append(file_menu,"File")
        menubar.Append(edit_menu,"Edit")
        self.SetMenuBar(menubar)

        self.Bind(wx.EVT_MENU, NewWindow.new_frame, None, 1)

class NewWindow(wx.Frame):

    def __init__(self,MainWindow,id):
        wx.Frame.__init__(self, None, id, 'New Window', size=(600,400))
        wx.Frame.CenterOnScreen(self)
        self.Show(False)

    def new_frame(self, event):
        NewWindow.Show(True)



if __name__=='__main__':
        app=wx.PySimpleApp()
        frame=MainWindow(parent=None,id=-1)
        frame.Show()
        app.MainLoop()

このコードを実行しようとすると、メニュー項目の [新しいウィンドウ] をクリックすると、このエラー メッセージが表示されます。

TypeError: unbound method new_frame() must be called with NewWindow instance as first argument (got CommandEvent instance instead)

繰り返しますが、私はプログラミングにかなり慣れていません。どんな助けも大歓迎です。また、私のコードが「最もきれいな」コードではないことも知っています。前もって感謝します!

4

2 に答える 2

2

Python でクラスがどのように機能するかを理解していないようです。を呼び出そうとしNewWindow.new_frameますが、そのクラスのインスタンスを実際に作成することはありません。

エラー メッセージは、クラスのインスタンスではなくクラスでメソッドを呼び出しているためです。あなたがしたいことは次のようなものです:

newWin = NewWindow(...) # replace ... with the appropriate parameters
newWin.Show(True)

あなたの例では、 NewWindow 呼び出しに適切なパラメーターが何であるかを知るのに十分な情報を提供していません (たとえば、メイン ウィンドウを作成する場所を示していませんMainWindow) 。 wxPython は親ウィンドウを認識する必要があります。wxFrame の作成方法を理解するには、wxPython のドキュメントを参照してください。idNewWindow.__init__

于 2012-06-26T04:34:24.557 に答える
1

コードをある程度変更すると、ユーザーが [新しいウィンドウ] オプションをクリックしたときに新しいウィンドウを表示できました。

私が変更したものをチェックして、これがあなたが望むものかどうか教えてください??

import wx

class MainWindow(wx.Frame):

    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,'Python Test App',size=(600,400))
        panel=wx.Panel(self)
        wx.Frame.CenterOnScreen(self)

        status=self.CreateStatusBar()
        menubar=wx.MenuBar()
        file_menu=wx.Menu()
        edit_menu=wx.Menu()

        ID_FILE_NEW = 1
        ID_FILE_OPEN = 2

        ID_EDIT_UNDO = 3
        ID_EDIT_REDO = 4


        file_menu.Append(ID_FILE_NEW,"New Window","This is a new window")
        file_menu.Append(ID_FILE_OPEN,"Open...","This will open a new window")

        edit_menu.Append(ID_EDIT_UNDO,"Undo","This will undo your last action")
        edit_menu.Append(ID_EDIT_REDO,"Redo","This will redo your last undo")


        menubar.Append(file_menu,"File")
        menubar.Append(edit_menu,"Edit")
        self.SetMenuBar(menubar)

        self.Bind(wx.EVT_MENU, self.test, None, 1)

    def test(self, event):
        self.new = NewWindow(parent=None, id=-1)
        self.new.Show()

class NewWindow(wx.Frame):

    def __init__(self,parent,id):
        wx.Frame.__init__(self, parent, id, 'New Window', size=(400,300))
        wx.Frame.CenterOnScreen(self)
        #self.new.Show(False)

if __name__=='__main__':
        app=wx.PySimpleApp()
        frame=MainWindow(parent=None,id=-1)
        frame.Show()
        app.MainLoop()
于 2012-06-26T05:43:10.630 に答える