【问题标题】:How to put 2 Frames in 1 Application with wxpython?如何使用 wxpython 在 1 个应用程序中放置 2 个框架?
【发布时间】:2012-01-06 21:59:56
【问题描述】:

你好,我已经创建了 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

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

【问题讨论】:

  • 您能否提供一个应用程序示例,该示例可以执行您/do/ 想要的操作?我猜测是 MDI,但我对这个猜测不太有信心。
  • (PS:不要做MDI,没人喜欢MDI。)

标签: python wxpython wxwidgets


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这些框架已经在同一个 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 的类。例如,查看 wxPython docs and demos 包中的 MDIDemo.py 示例。请注意,虽然 wxPython 支持多文档界面窗口,但 Windows 已弃用 MDI。

    【讨论】:

    • 有没有办法在“MainFrame”中做到这一点,而不是创建一个新的类
    猜你喜欢
    • 2014-10-16
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多