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

如何使用wxpython布局3窗格窗口?

  •  5
  • andy47  · 技术社区  · 15 年前

    我试图找到一种简单的方法来使用wxpython来布局一个3窗格的窗口。

    我想在左窗格中有一个树列表,然后将右窗格拆分为两个-顶部是编辑组件,底部是网格组件。

    沿着这条线的东西:

    --------------------------------------
    |             |                      |
    |             |        Edit          |
    |  Tree       |        Control       |
    |  Control    |                      |
    |             |----------------------|
    |             |                      |
    |             |        Grid          |
    |             |                      |
    --------------------------------------
    

    我希望窗口可以重新调整大小,并允许用户通过拖动边框来更改窗口中每个组件的(相对)大小。

    我认为我需要一些sizer和/或splitter窗口组件的组合,但在文档或Web上找不到此类窗口的合适示例。

    4 回复  |  直到 8 年前
        1
  •  7
  •   RSabet    15 年前

    首先下载 wxGlade wxpython的GUI构建器(可选 XRCed 我更喜欢WXGLADE)。

    然后你必须决定是否要使用 GridSizer 或A Splitter 你就完了。在下面可以找到两者(在树和右侧之间是一个网格大小调整器->自动调整大小)。edit和gridctrl之间是一个sizer(手动调整大小)。

    当做。

    一分钟工作,不输入一行代码:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # generated by wxGlade 0.6.3 on Sat Feb 07 10:02:31 2009
    
    import wx
    import wx.grid
    
    # begin wxGlade: extracode
    # end wxGlade
    
    
    
    class MyDialog(wx.Dialog):
        def __init__(self, *args, **kwds):
            # begin wxGlade: MyDialog.__init__
            kwds["style"] = wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER|wx.THICK_FRAME
            wx.Dialog.__init__(self, *args, **kwds)
            self.window_1 = wx.SplitterWindow(self, -1, style=wx.SP_3D|wx.SP_BORDER)
            self.tree_ctrl_1 = wx.TreeCtrl(self, -1, style=wx.TR_HAS_BUTTONS|wx.TR_LINES_AT_ROOT|wx.TR_DEFAULT_STYLE|wx.SUNKEN_BORDER)
            self.text_ctrl_1 = wx.TextCtrl(self.window_1, -1, "This is the Edit", style=wx.TE_MULTILINE)
            self.grid_1 = wx.grid.Grid(self.window_1, -1, size=(1, 1))
    
            self.__set_properties()
            self.__do_layout()
            # end wxGlade
    
        def __set_properties(self):
            # begin wxGlade: MyDialog.__set_properties
            self.SetTitle("dialog_1")
            self.grid_1.CreateGrid(10, 3)
            # end wxGlade
    
        def __do_layout(self):
            # begin wxGlade: MyDialog.__do_layout
            grid_sizer_1 = wx.FlexGridSizer(1, 2, 3, 3)
            grid_sizer_1.Add(self.tree_ctrl_1, 1, wx.EXPAND, 0)
            self.window_1.SplitHorizontally(self.text_ctrl_1, self.grid_1)
            grid_sizer_1.Add(self.window_1, 1, wx.EXPAND, 0)
            self.SetSizer(grid_sizer_1)
            grid_sizer_1.Fit(self)
            grid_sizer_1.AddGrowableRow(0)
            grid_sizer_1.AddGrowableCol(0)
            grid_sizer_1.AddGrowableCol(1)
            self.Layout()
            # end wxGlade
    
    # end of class MyDialog
    
    
    class MyApp(wx.App):
        def OnInit(self):
            wx.InitAllImageHandlers()
            mainDlg = MyDialog(None, -1, "")
            self.SetTopWindow(mainDlg)
            mainDlg.Show()
            return 1
    
    # end of class MyApp
    
    if __name__ == "__main__":
        app = MyApp(0)
        app.MainLoop()
    
        2
  •  7
  •   Orjanp    15 年前

    这是一个使用wx.aui和三个面板的非常简单的布局。我想你可以很容易地适应你的需要。

    Orjanp…

    import wx
    import wx.aui
    
    class MyFrame(wx.Frame):
        def __init__(self, *args, **kwargs):
            wx.Frame.__init__(self, *args, **kwargs)
    
            self.mgr = wx.aui.AuiManager(self)
    
            leftpanel = wx.Panel(self, -1, size = (200, 150))
            rightpanel = wx.Panel(self, -1, size = (200, 150))
            bottompanel = wx.Panel(self, -1, size = (200, 150))
    
            self.mgr.AddPane(leftpanel, wx.aui.AuiPaneInfo().Bottom())
            self.mgr.AddPane(rightpanel, wx.aui.AuiPaneInfo().Left().Layer(1))
            self.mgr.AddPane(bottompanel, wx.aui.AuiPaneInfo().Center().Layer(2))
    
            self.mgr.Update()
    
    
    class MyApp(wx.App):
        def OnInit(self):
            frame = MyFrame(None, -1, '07_wxaui.py')
            frame.Show()
            self.SetTopWindow(frame)
            return 1
    
    if __name__ == "__main__":
        app = MyApp(0)
        app.MainLoop()
    
        3
  •  3
  •   Eli Bendersky    15 年前

    你应该使用wxsplitter, here's 一个例子。另一个 here . 和 another .

        4
  •  2
  •   Alex McBride    15 年前

    你可以考虑使用 wx.aui 高级用户界面模块,因为它允许您非常容易地构建这样的UI。此外,用户还可以最小化、最大化和拖动窗格,无论它们是否合适。它很灵活。实际上,我发现使用AUI工具箱来设计这种UI比使用网格和拆分器更容易。再加上所有花哨的按钮,使应用程序看起来更酷。:)

    官方演示中有一个很好的例子,叫做aui-dockingwindowmgr。