在wxPython中显示另一个窗口/帧

在wxPython中显示另一个窗口/帧,python,wxpython,Python,Wxpython,我对编程以及python和wxpython相当陌生。我已经仔细阅读了这段代码好几个小时了,我试着在网上到处寻找答案。我很难在单击菜单项后显示新窗口。这是我到目前为止的代码 import wx class MainWindow(wx.Frame): def __init__(self,parent,id): wx.Frame.__init__(self,parent,id,'Python Test App',size=(600,400)) panel=w

我对编程以及python和wxpython相当陌生。我已经仔细阅读了这段代码好几个小时了,我试着在网上到处寻找答案。我很难在单击菜单项后显示新窗口。这是我到目前为止的代码

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()
当我尝试运行此代码时,单击菜单项“New Window”(新建窗口)后会收到此错误消息


再说一次,我对编程相当陌生。非常感谢您的帮助,而且我知道我的代码可能不是最“干净”的代码。提前谢谢

您似乎不了解类在Python中是如何工作的。您尝试调用
NewWindow.new\u frame
,但从未实际创建该类的实例

错误消息是因为您在类上而不是在类的实例上调用该方法。您想做的是:

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

在示例中,您没有提供足够的信息来了解NewWindow调用的适当参数(例如,您没有显示创建主窗口的位置),但是
NewWindow中的
main窗口
id
参数。\uuuu init\uuuu
不仅仅是为了外观:wxPython需要知道父窗口。您应该查看wxPython文档以了解如何创建wxFrame。

您似乎不了解类在Python中是如何工作的。您尝试调用
NewWindow.new\u frame
,但从未实际创建该类的实例

错误消息是因为您在类上而不是在类的实例上调用该方法。您想做的是:

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

在示例中,您没有提供足够的信息来了解NewWindow调用的适当参数(例如,您没有显示创建主窗口的位置),但是
NewWindow中的
main窗口
id
参数。\uuuu init\uuuu
不仅仅是为了外观:wxPython需要知道父窗口。您应该查看wxPython文档,了解如何创建wxFrame。

在某种程度上修改代码,当用户单击新窗口选项时,我能够显示一个新窗口

一定要检查我修改的东西,让我知道这是否是你想要的

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

在某种程度上修改代码,当用户单击新窗口选项时,我能够显示一个新窗口

一定要检查我修改的东西,让我知道这是否是你想要的

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

仅仅是一个指针,调用像这样的方法
wx.Frame.CenterOnScreen(self)
不是您通常调用方法的方式。由于您处于
wx.Frame
的实例中,因此您可以访问Frame的所有方法,因此您可以调用
self.CenterOnScreen()
。您应该只需要调用前一种方法,因为您已经重写了该方法(比如调用
wx.Frame时)。例如,在
\uuuuuuinit\uuuu
中调用
wx.Frame.CenterOnScreen(self)
时,如果您不再拥有对该方法的访问权限,则只需要调用一个指针,调用像这样的
wx.Frame.CenterOnScreen(self)
方法并不是您通常调用的方式。由于您处于
wx.Frame
的实例中,因此您可以访问Frame的所有方法,因此您可以调用
self.CenterOnScreen()
。唯一需要调用前一种方法的时间是,如果您已经重写了该方法,因此不再具有对该方法的访问权限(例如,当调用
wx.Frame时)