2009-02-07 10 views
5

Ich versuche eine einfache Möglichkeit zu finden, ein 3-Fenster mit wxPython zu gestalten.Wie lege ich ein 3-Fenster mit wxPython?

Ich möchte eine Baumliste im linken Fensterbereich haben, dann haben Sie ein rechtes Fenster, das in zwei geteilt ist - mit einer Schnittkomponente im oberen Teil und einer Rasterkomponente im unteren Teil.

Etwas entlang der Linien von:

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

ich das Fenster sein möchte erneut ansehnlich und gibt dem Benutzer die Möglichkeit, die (relative) Grße jedes der Bauteile innerhalb der Fenster zu ändern, indem Sie Die Grenzen.

Ich denke, ich brauche eine Kombination von Sizern und/oder Splitter-Window-Komponenten, kann aber kein anständiges Beispiel für diese Art von Fenster in der Dokumentation oder im Internet finden.

Antwort

7

Zunächst einmal herunterladen wxGlade ein Gui-Builder für wxPython (Alternative XRCed, ich bevorzuge wxGlade).

Dann müssen Sie entscheiden, ob Sie eine GridSizer oder eine Splitter verwenden möchten und Sie sind fertig. Unten finden Sie beides (zwischen Baum und rechter Seite befindet sich ein GridSizer -> passt sich automatisch an). Zwischen Edit und GridCtrl befindet sich ein Sizer (manuelle Größenanpassung).

Grüße.

1 Minute Arbeit, ohne eine einzige Zeile Code eingeben:

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

Danke, das ist das, was ich suchte. Ich habe das Layout (etwas) mit XRCed repliziert und verwende das in meiner Anwendung. – andy47

+2

weder wxGlade noch XRCed sind erforderlich, um eine praktikable Lösung zu machen. –

3

Sie sollten wxSplitter, here's ein Beispiel verwenden. Ein weiterer here. Und another.

2

Sie in Erwägung ziehen könnte die wx.aui erweiterte Benutzerschnittstellenmodul verwendet wird, wie es Ihnen UIs wie diese erstellen können sehr leicht. Außerdem kann der Benutzer die Fenster minimieren, maximieren und ziehen, so wie sie es für richtig halten oder nicht. Es ist ziemlich flexibel. Ich finde es tatsächlich einfacher, diese Art von UI mit dem AUI-Toolkit auszulegen, als mit Gittern und Splittern. Plus alle schicken Knöpfe machen Apps cooler. :)

Es gibt ein schönes Beispiel in den offiziellen Demos, genannt AUI_DockingWindowMgr.

7

Dies ist ein sehr einfaches Layout mit wx.aui und drei Panels. Ich denke, Sie können es leicht an Ihre Bedürfnisse anpassen.

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

+1 für 'aui', macht es ein funktionelles IDE-ähnliches Layout leicht – Kos

Verwandte Themen