如何在wxpython中将两个框架放入一个应用程序中?

4 投票
2 回答
7921 浏览
提问于 2025-04-17 07:06

你好,我创建了两个框架,当我运行这个程序时,它们会在窗口上各自显示,就像是两个独立的应用程序。请问有没有办法把这两个框架放在一个应用程序里使用呢?

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

这是我不想要的效果: https://i.stack.imgur.com/7gayc.png

这就是我不想要的效果,我希望这两个框架能在一个应用程序里。

2 个回答

0

我觉得在初始化子窗口的时候,把子窗口的样式选项设置为 wx.FRAME_NO_TASKBAR 可能可以解决这个问题。

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

然后你创建一个公共框架,并实例化你的面板(并把它们放在一个布局管理器里):

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窗口:

在这里输入图片描述

那么你就需要使用wx.MDIParentFrame和wx.MDIChildFrame类。想要了解更多,可以查看包中的MDIDemo.py示例。需要注意的是,虽然wxPython支持多文档界面窗口,但Windows已经不再推荐使用MDI了。

撰写回答