2009-02-07 17 views
5

wxPython kullanarak 3 bölmeli bir pencere düzenlemenin basit bir yolunu bulmaya çalışıyorum.wxPython'u kullanarak 3 bölmeli bir pencereyi nasıl düzenlerim?

Sol bölmede bir ağaç listesi istiyorum, sonra ikiye ayrılan bir sağ bölüme sahip olmalı - üst kısımda bir düzenleme bileşeni ve alt kısımda bir ızgara bileşeni. çizgisinde

bir şey: pencereyi istiyorum

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

boyutlandırılabilir yeniden ve kullanıcı sürükleyerek pencere içindeki bileşenlerin her birinin (göreli) boyutunu değiştirme olanağı vermek üzere sınırlar.

Bazı boyutlandırma ve/veya ayırıcı pencere bileşenlerine gereksinim duyduğumu ancak dokümanlarda veya web'de bu tür bir pencerenin iyi bir örneğini bulamıyorum.

cevap

7

Her şeyden önce, wxPython için bir gui oluşturucu olan wxGlade (alternatif XRCed, i prefere wxGlade).

O zaman bir GridSizer veya Splitter kullanmak isteyip istemediğinize karar vermelisiniz ve işiniz bitti. Her ikisini birden bulursanız (Ağacı ve sağ taraf GridSizer - otomatik olarak yeniden boyutlandırılır). Edit ve GridCtrl arasında bir Sizer (manuel Yeniden Boyutlandır) olduğunu.

Saygılarımızla. Tek bir kod satırı girmeden

bir dakika çalışması:

#!/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

Teşekkür

Orjanp ... o aradığım şeydir. Tam tersine, düzeni (biraz) XRCed kullanarak çoğalttım ve bunu uygulamamda kullanıyorum. – andy47

+2

ne wxGlade ne de XRCed uygulanabilir bir çözüm yapmak için gerekli değildir. Aui için –

2

o çok kolay böyle UI'lerini oluşturmanıza olanak verir gibi, wx.aui gelişmiş kullanıcı arabirimi modülü kullanmayı düşünebilirsiniz. Ayrıca, kullanıcı bölmeleri en aza indirir, en üst düzeye çıkarır ve bölmeleri uygun gördüğü şekilde sürükleyebilir veya sürükleyebilir. Oldukça esnek. Aslında bu tür kullanıcı arayüzlerini otomatik olarak araç gereçleriyle değil, ızgaralarla ve bölmelerle yerleştirmeyi daha kolay buluyorum. Ayrıca tüm fantezi düğmeler, uygulamaların daha havalı görünmesini sağlar.

AUI_DockingWindowMgr adlı resmi demolarda güzel bir örnek var.

7

Bu, wx.aui ve üç panel kullanarak çok basit bir düzendir. Sanırım ihtiyaçlarınıza göre kolayca uyarlayabilirsiniz.

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

+1, işlevsiz bir IDE benzeri düzeni kolayca yapar – Kos

İlgili konular