2009-02-07 28 views
5

Estoy tratando de encontrar una forma simple de diseñar una ventana de 3 paneles usando wxPython.¿Cómo diseño una ventana de 3 paneles usando wxPython?

Quiero tener una lista de árbol en el panel izquierdo, luego tengo un panel derecho que se divide en dos, con un componente de edición en la parte superior y un componente de cuadrícula en la parte inferior.

Algo a lo largo de las líneas de:

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

Me gustaría que la ventana para ser re-importante y le da al usuario la capacidad de cambiar el tamaño (relativa) de cada uno de los componentes dentro de las ventanas arrastrando las fronteras.

Me imagino que necesito una combinación de sizer y/o componentes de ventana divisora ​​pero no puedo encontrar un ejemplo decente de este tipo de ventana en la documentación o en la web.

Respuesta

7

En primer lugar descargue wxGlade un generador de interfaz gráfica de usuario para wxPython (alternativa XRCed, prefiero wxGlade).

Luego tiene que decidir si quiere usar un GridSizer o un Splitter y listo. A continuación encontrará los dos (entre Tree y el lado derecho es un GridSizer -> cambia el tamaño automáticamente). Entre Edit y GridCtrl hay un Sizer (cambio de tamaño manual).

Atentamente.

una obra minutos sin introducir una sola línea de código:

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

Gracias, eso es lo que estaba buscando. Solo para ser contrario, repliqué el diseño (algo) usando XRCed y lo estoy usando en mi aplicación. – andy47

+2

ni wxGlade ni XRCed son necesarios para hacer una solución viable. –

2

Se podría considerar el uso del módulo de interfaz de usuario avanzada wx.aui, ya que le permite construir interfaces de usuario de este tipo con mucha facilidad. Además, el usuario puede minimizar, maximizar y arrastrar los paneles como mejor le parezca o no. Es bastante flexible. De hecho, me resulta más fácil diseñar este tipo de UI con el kit de herramientas Aui, en lugar de con grillas y divisores. Además, todos los botones sofisticados hacen que las aplicaciones se vean más frescas. :)

Hay un buen ejemplo en las demostraciones oficiales, llamado AUI_DockingWindowMgr.

7

Este es un diseño muy simple usando wx.aui y tres paneles. Supongo que puedes adaptarlo fácilmente a tus necesidades.

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 para 'aui', hace un diseño funcional similar a IDE fácilmente – Kos

Cuestiones relacionadas