【问题标题】:wxPython: displaying multiple widgets in same framewxPython:在同一帧中显示多个小部件
【发布时间】:2010-09-15 22:40:30
【问题描述】:

我希望能够在单个框架中显示NotebookTxtCtrl wx 小部件。以下是改编自 wxpython wiki 的示例;是否可以更改它们的布局(可能使用wx.SplitterWindow 之类的东西)以在同一帧中显示Notebook 下方的文本框?

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

【问题讨论】:

    标签: python user-interface layout wxpython wxwidgets


    【解决方案1】:

    实际上,让两个小部件出现在同一个框架上很容易。您应该使用 sizers 来完成此操作。

    在您的示例中,您可以将 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官方文章了解更多关于sizer的信息。

    【讨论】:

    【解决方案2】:

    你可以使用分离器,是的。

    此外,创建一个面板,将您的小部件放入其中(使用大小调整器),然后将此面板添加到框架中是有意义的。

    【讨论】:

    • 您能否参考上述课程添加一些关于我如何做到这一点的提示?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多