Встроить отдельные графические интерфейсы WX в закладки ноутбука

В основном у меня есть 3 отдельных графических интерфейса wxPython, которые я хотел бы объединить в одно приложение, предоставив каждому графическому интерфейсу свою вкладку для ноутбука. Я не совсем уверен, как это сделать, и ищу несколько советов. Я ценю любые комментарии или мысли, которые я могу получить.

Моя идея состоит в том, что это должно выглядеть примерно так:

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 он просто помещает серый квадрат в верхний правый угол, а с ними он вылетает.

Заранее спасибо!

2 ответа

Я предполагаю, что в каждом из ваших фреймов есть панели с нужным вам кодом. Просто возьмите код для виджетов из каждого из этих фреймов и поместите их в каждый из классов Page. Вам, вероятно, придется изменить родителей виджетов на "себя" вместо "панели" или как вы их называете.

Тогда вы не будете открывать фрейм в каждой базе кода страницы. Вы не хотите открывать рамку там. Вы хотите, чтобы страница была родителем виджетов, а не открывала что-то еще.

Благодаря вашей помощи я получил это, чтобы работать на меня. Поскольку каждое из моих других wx-приложений имело классы Panel со всеми необходимыми виджетами, мне не нужно было создавать классы для каждой страницы. Вот код:

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

Спасибо за помощь!

Другие вопросы по тегам