【问题标题】:Embed Separate WX GUIs into Notebook Tabs将单独的 WX GUI 嵌入到笔记本选项卡中
【发布时间】:2013-01-28 19:49:07
【问题描述】:

我基本上有 3 个独立的 wxPython GUI,我想将它们组合成一个应用程序,为每个 GUI 提供自己的笔记本选项卡。我不确定如何做到这一点,我正在寻找一些建议。我很感激我能得到的任何想法或想法。

我的想法是它应该看起来像这样:

import wx
import OtherFrame

class PageOne(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        t = wx.StaticText(self, -1, "This is a PageOne object", (20,20))

        panel=OtherFrame.Panel(parent)
        box = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(self,box)
        panel.Layout(self, parent)        

class PageTwo(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        t = wx.StaticText(self, -1, "This is a PageTwo object", (40,40))

class PageThree(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        t = wx.StaticText(self, -1, "This is a PageThree object", (60,60))


class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="Simple Notebook Example")

        p = wx.Panel(self)
        nb = wx.Notebook(p)
        page1 = PageOne(nb)
        page2 = PageTwo(nb)
        page3 = PageThree(nb)
        nb.AddPage(page1, "Page 1")
        nb.AddPage(page2, "Page 2")
        nb.AddPage(page3, "Page 3")
        sizer = wx.BoxSizer()
        sizer.Add(nb, 1, wx.EXPAND)
        p.SetSizer(sizer)

if __name__ == "__main__":
    app = wx.App()
    MainFrame().Show()
    app.MainLoop()

但这会产生一些错误和崩溃。如果没有 PageOne 下的 sizer,它只会在右上角放置一个灰色方块,使用它们,它会崩溃。

提前致谢!

【问题讨论】:

  • 其实你已经不需要PageOne、二、三类了。您在 OtherFrame 中有一个 Panel 类。所以你应该可以做 page1 = OtherFrame.Panel(nb)
  • 太棒了!这完美!非常感谢!!!

标签: python wxpython wxwidgets wxnotebook


【解决方案1】:

我假设您的每个框架中都有面板,其中包含您想要的代码。只需从每个框架中获取小部件的代码并将其放入每个 Page 类中。您可能必须将小部件的父级更改为“self”而不是“panel”或您所称的任何名称。

那么您将不会在每个页面代码库中打开一个框架。你不想在那里打开一个框架。您希望页面成为小部件的父级,而不是打开其他东西。

【讨论】:

  • 是否有办法通过将其他 GUI 作为模块导入来做到这一点?他们每个人的代码都相当长,所以我想尽可能地让事情井井有条。我将继续尝试将面板代码粘贴到页面类中。谢谢!
  • 这取决于。其他 GUI 中的面板类中的小部件是否存在?如果是这样,那么您可以只执行“import OtherFrame”,然后执行“OtherFrame.MyPanelClass”并将笔记本作为父级传递给他们。
  • 是的,我拥有面板类中的所有内容。我将文件作为 OtherFrame 导入,然后将 OtherFrame.Panel(parent) 添加到 PageOne 类中。然而,这只是在笔记本的左上角增加了一个灰色的小方块。我想这发生在我之前,当我有一个没有框架的面板时。你知道我在这里做错了什么吗?
  • 我猜是育儿问题。确保导入的面板将笔记本作为其父级。您可能必须将其放入笔记本页面内的 sizer 中,并将比例设置为 1 以及 wx.EXPAND 标志。如果它在您调整框架大小时突然出现,那么您只需要调用 Layout()
  • 如果我调整框架大小,它似乎不存在。我尝试添加sizer(请参阅上面的编辑代码),但我不断收到错误并且它崩溃了。恐怕我对 sizers 不是很有经验,看起来正确吗?
【解决方案2】:

感谢您的帮助,我得到了这个为我工作。由于我的每个其他 wx 应用程序都有包含我想要的所有小部件的面板类,因此我不需要为每个页面创建类。代码如下:

import wx
import OtherFrame1
import OtherFrame2
import OtherFrame3

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="Simple Notebook Example")

        p = wx.Panel(self)
        nb = wx.Notebook(p)
        page1 = OtherFrame1.Panel(nb)
        page2 = OtherFrame2.Panel(nb)
        page3 = OtherFrame3.Panel(nb)
        nb.AddPage(page1, "Page 1")
        nb.AddPage(page2, "Page 2")
        nb.AddPage(page3, "Page 3")
        sizer = wx.BoxSizer()
        sizer.Add(nb, 1, wx.EXPAND)
        p.SetSizer(sizer)

if __name__ == "__main__":
    app = wx.App(redirect=False)
    MainFrame().Show()
    app.MainLoop()

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-27
    • 2020-11-14
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多