2009-02-07 69 views
5

我想找到一个简单的方法来使用wxPython来布局3窗格窗口。如何使用wxPython布局3窗格窗口?

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

东西沿着线:

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

我想的窗口被重新相当大的,并给用户通过拖动来改变各窗口内的部件的(相对)大小的能力边界。

我觉得我需要sizer和/或splitter-window组件的一些组合,但在文档或Web上找不到这种窗口的一个体面的例子。

回答

7

首先下载wxGlade为wxPython的gui构建器(替代XRCed,我优先wxGlade)。

然后,你必须决定是否要使用GridSizerSplitter,你就完成了。下面你会发现两者(在Tree和右边是GridSizer - >自动调整大小)。 Edit和GridCtrl之间是一个Sizer(手动调整大小)。

问候。无需输入的一行代码

1分钟工作:

#!/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() 
+0

谢谢,这是我一直在寻找。恰恰相反,我使用XRCed复制了布局(有点),并在我的应用程序中使用它。 – andy47 2009-02-10 00:13:48

+2

既不需要wxGlade也不需要XRCed来制定可行的解决方案。 – 2010-11-09 15:21:53

2

你可以考虑使用wx.aui高级用户界面模块,因为它可以让你很方便地建立这样的用户界面。用户也可以根据需要最小化,最大化和拖动窗格,或者不要。它非常灵活。实际上,我发现使用aui工具包而不是使用网格和分割器来布局这种UI是比较容易的。再加上所有的花式按钮使应用看起来更酷。 :)

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

7

这是一个使用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()