【问题标题】:Can/How do I create a class panel and use it in my main frame (wxpython)可以/如何创建一个类面板并在我的主框架中使用它(wxpython)
【发布时间】:2012-06-22 07:22:35
【问题描述】:

我目前的设置

class AppFrame(wx.Frame):
    def__init__(self,parent,id=-1,title='program'):
        wx.Frame.__init__(self,parent,id,title,size=((400,400)))
        # Panels
        self.AppPanel = wx.Panel(self,-1)
        self.AppPanel.SetBackgroundColour('grey')

class NBPanel(wx.Notebook):
     def__init__(etc)

如何在我的 AppFrame 中添加这个 NBPanel 类(我试图制作一个笔记本面板),以便它在我的 AppFrame 中显示两个面板。当我试图弄清楚这一点时,我的头脑变得疯狂。我是否应该让 NBPanel 类成为 AppPanel 的子类?

如:

class AppFrame(wx.Frame):
    def__init__(self,parent,id=-1,title='Mango'):
        wx.Frame.__init__(self,parent,id,title,size=((400,400)))

        # Panels
        self.AppPanel = wx.Panel(self,-1)
        self.AppPanel.SetBackgroundColour('grey')

        **self.AppPanel2 = NBPanel(self.AppPanel,-1)**

我尝试了一些变体,基本上得到了几种错误。

顺便说一句,(AppPanel)并不像这段代码显示的那样裸露,它有一个设置为左垂直的sizer,带有几个按钮等。我希望笔记本面板占据 AppFrame 的大部分中间区域,因为我仍然需要在笔记本面板的右侧添加另一个面板。

【问题讨论】:

    标签: wxpython frames panels


    【解决方案1】:

    您仍然需要一个覆盖整个框架的面板,如果该面板是框架的唯一子级,这将自动发生。

    要获得所需的布局,您需要在水平尺寸盒 (wx.BoxSizer(wx.HORIZONTAL)) 中排列内容。如果您先添加带有按钮的 sizer,然后添加 NBPanel,然后在右侧添加您想要的面板,您应该会得到所需的布局。

    所有这些控件都需要 AppPanel 作为父级,您需要将水平尺寸调整器设置为 AppPanels 尺寸调整器。

    要让笔记本占据框架中的大部分空间,您需要将其添加到比例为 1 的大小调整器中,而其他项目的比例为 0。

    如果这能让事情更清楚,我很乐意制作一个快速演示:)

    编辑:

    这里有一个简单的示例,它应该为您所追求的布局提供一个大纲,如果您有任何问题,请告诉我。另请查看this guide,它真的很棒,并提供了大量示例,让您开始使用不同的程序和布局。

    import wx
    
    class NoteBookPage(wx.Panel):
        def __init__(self,parent,message):
            wx.Panel.__init__(self,parent)
            sizer= wx.BoxSizer(wx.VERTICAL)
            message= wx.StaticText(self,label=message)
            sizer.Add(message,1,wx.ALIGN_CENTRE)
            self.SetSizer(sizer)
    
    
    class AppFrame(wx.Frame):
        def __init__(self,parent,id=-1,title='program'):
            wx.Frame.__init__(self,parent,id,title,size=((400,400)))
            # Panels
            self.AppPanel = wx.Panel(self,-1)
            self.AppPanel.SetBackgroundColour('grey')
    
            main_sizer= wx.BoxSizer(wx.HORIZONTAL)
    
            button_sizer= wx.BoxSizer(wx.VERTICAL)
    
            #buttons
            self.button1= wx.Button(self.AppPanel,label="Button 1")
            button_sizer.Add(self.button1,0,wx.EXPAND)
            self.button2= wx.Button(self.AppPanel,label="Button 2")
            button_sizer.Add(self.button2,0,wx.EXPAND)
            self.button3= wx.Button(self.AppPanel,label="Button 3")
            button_sizer.Add(self.button3,0,wx.EXPAND)
            main_sizer.Add(button_sizer,0,wx.ALL,5)
    
            #notebook
            self.Notebook= wx.Notebook(self.AppPanel)
            page1= NoteBookPage(self.Notebook,"I'm on page 1")
            page2= NoteBookPage(self.Notebook,"I'm on page 2")
            self.Notebook.AddPage(page1,"Page 1")
            self.Notebook.AddPage(page2,"Page 2")
            main_sizer.Add(self.Notebook,1,wx.ALL|wx.EXPAND,5)
    
            #panel on the right (I'm just re-using the NoteBookPage panel to save making a new one)
            right_panel= NoteBookPage(self.AppPanel,"right panel")
            main_sizer.Add(right_panel,0,wx.ALL,5)
    
            self.AppPanel.SetSizer(main_sizer)
    
            self.Show()
    
    if __name__ == "__main__":
        app= wx.App(False)
        frame= AppFrame(None)
        app.MainLoop()
    

    【讨论】:

    • 我将不胜感激。看到代码真的会帮助我理解这个过程。
    猜你喜欢
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2014-02-26
    • 2011-12-19
    • 1970-01-01
    • 2013-08-27
    相关资源
    最近更新 更多