如何使用wxpython将2个框架放入1个应用程序中?

时间:2011-11-26 14:12:09

标签: python wxpython wxwidgets

您好我创建了2个帧,当我运行此程序时,它会将每个帧显示为自己的应用程序(至少在Windows上)。有没有办法同时使用两个框架但是将它们放在一个应用程序中?

import wx

class MainFrame(wx.Frame): 
    def __init__(self): 
        wx.Frame.__init__(self, None, wx.NewId(), "Main") 
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.button = wx.Button(self, wx.NewId(), "Open a child")
        self.sizer.Add(self.button, proportion=0, border=2, flag=wx.ALL)
        self.SetSizer(self.sizer)
        self.button.Bind(wx.EVT_BUTTON, self.on_button)

        self.Layout()

    def on_button(self, evt):
        frame = ChildFrame(self)
        frame.Show(True)
        frame.MakeModal(True)

class ChildFrame(wx.Frame): 
    def __init__(self, parent): 
        wx.Frame.__init__(self, parent, wx.NewId(), "Child")
        self.Bind(wx.EVT_CLOSE, self.on_close)

    def on_close(self, evt):
        self.MakeModal(False)
        evt.Skip()

class MyApp(wx.App):
    def OnInit(self):
        frame = MainFrame()
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

app = MyApp(0)
app.MainLoop()    

这是我不想要的图像: http://i.stack.imgur.com/7gayc.png

这是我不想要的, 我希望两个帧都在一个应用程序中。

2 个答案:

答案 0 :(得分:4)

这些框架已在同一个wxPython应用程序(MyApp)中运行 可能你的意思是在同一个wxPython窗口中有两个框架/窗口。

我认为这是不可能的,因为根据定义wx.Frame类是一个独立的窗口。

您可以非常轻松地修改当前类,以便从wx.Panel而不是wx.Frame派生,然后将两个面板放在同一个公共框架中。

例如,您可以像这样修改ChildFrame:

class ChildPanel(wx.Panel): 
    def __init__(self, parent): 
        wx.Panel.__init__(self, parent, wx.NewId())
    .........................................

然后创建公共框架并实例化面板(并在sizer中设置它们):

class Common(wx.Frame): 
    def __init__(self, parent): 
        wx.Frame.__init__(self, parent, wx.NewId(), "Common")
        self.Bind(wx.EVT_CLOSE, self.on_close)

        self.child = ChildPanel(self, .....)
        self.main = MainPanel(self, .....)

        ................... 

如果按照Inerdial的评论中的建议,您实际上正在寻找MDI窗口:

enter image description here

然后你必须使用wx.MDIParentFrame和wx.MDIChildFrame的类。例如,检查wxPython docs and demos包中的MDIDemo.py示例。请注意,尽管wxPython支持多文档接口窗口,但Windows已弃用MDI。

答案 1 :(得分:0)

我认为在初始化子框架时将子框架的样式选项作为wx.FRAME_NO_TASKBAR放在参数中可能会解决问题。