代码之家  ›  专栏  ›  技术社区  ›  unmounted

wxpython:在同一帧中显示多个小部件

  •  2
  • unmounted  · 技术社区  · 16 年前

    我想展示一下 Notebook 和A TxtCtrl 单个帧中的WX小部件。下面是一个改编自wxpython wiki的示例;是否可以更改它们的布局(可能是 wx.SplitterWindow )显示文本框在 笔记本电脑 在同一帧中?

    import wx
    import wx.lib.sheet as sheet
    
    class MySheet(sheet.CSheet):
        def __init__(self, parent):
            sheet.CSheet.__init__(self, parent)
    
            self.SetLabelBackgroundColour('#CCFF66')
            self.SetNumberRows(50)
            self.SetNumberCols(50)
    
    
    class Notebook(wx.Frame):
        def __init__(self, parent, id, title):
            wx.Frame.__init__(self, parent, id, title, size=(600, 600))
            menubar = wx.MenuBar()
            file = wx.Menu()
            file.Append(101, 'Quit', '' )
            menubar.Append(file, "&File")
            self.SetMenuBar(menubar)
            wx.EVT_MENU(self, 101, self.OnQuit)
            nb = wx.Notebook(self, -1, style=wx.NB_BOTTOM)
            self.sheet1 = MySheet(nb)
            self.sheet2 = MySheet(nb)
            self.sheet3 = MySheet(nb)
            nb.AddPage(self.sheet1, "Sheet1")
            nb.AddPage(self.sheet2, "Sheet2")
            nb.AddPage(self.sheet3, "Sheet3")
            self.sheet1.SetFocus()
            self.StatusBar()
    
        def StatusBar(self):
            self.statusbar = self.CreateStatusBar()
    
        def OnQuit(self, event):
            self.Close()
    
    
    class MyFrame(wx.Frame):
        def __init__(self, parent, id, title):
            wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(450, 400))
            self.text = wx.TextCtrl(self, -1, style = wx.TE_MULTILINE)
            self.Center()
    
    class MyApp(wx.App):
        def OnInit(self):
            frame = Notebook(None, -1, 'notebook.py')
            frame.Show(True)
            frame.Center()
            frame2 = MyFrame(None, -1, '')
            frame2.Show(True)
            self.SetTopWindow(frame2)
            return True
    
    
    app = MyApp(0)
    app.MainLoop()
    
    2 回复  |  直到 16 年前
        1
  •  8
  •   Dzinx    16 年前

    实际上,在同一帧上显示两个小部件很容易。您应该使用sizer来完成这项工作。

    在您的示例中,可以更改 Notebook 类实现如下:

    class Notebook(wx.Frame):
        def __init__(self, parent, id, title):
            wx.Frame.__init__(self, parent, id, title, size=(600, 600))
            menubar = wx.MenuBar()
            file = wx.Menu()
            file.Append(101, 'Quit', '' )
            menubar.Append(file, "&File")
            self.SetMenuBar(menubar)
            wx.EVT_MENU(self, 101, self.OnQuit)
            nb = wx.Notebook(self, -1, style=wx.NB_BOTTOM)
            self.sheet1 = MySheet(nb)
            self.sheet2 = MySheet(nb)
            self.sheet3 = MySheet(nb)
            nb.AddPage(self.sheet1, "Sheet1")
            nb.AddPage(self.sheet2, "Sheet2")
            nb.AddPage(self.sheet3, "Sheet3")
            self.sheet1.SetFocus()
            self.StatusBar()
            # new code begins here:
            # add your text ctrl:
            self.text = wx.TextCtrl(self, -1, style = wx.TE_MULTILINE)
            # create a new sizer for both controls:
            sizer = wx.BoxSizer(wx.VERTICAL)
            # add notebook first, with size factor 2:
            sizer.Add(nb, 2)
            # then text, size factor 1, maximized
            sizer.Add(self.text, 1, wx.EXPAND)
            # assign the sizer to Frame:
            self.SetSizerAndFit(sizer)
    

    只有 __init__ 方法已更改。请注意,您可以通过更改 Add 方法。

    你可以从官方那里了解更多关于尺寸器的信息 Sizer overview 文章。

        2
  •  1
  •   Eli Bendersky    16 年前

    可以使用拆分器。

    此外,创建一个面板,将小部件放入其中(使用sizer),并将此面板添加到框架中是有意义的。