在wxPython中显示另一个窗口/帧
我对编程以及python和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
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时)