2009-02-07 68 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()