2009-02-07 2 views
5

Я пытаюсь найти простой способ компоновки окна с 3-мя панелями с помощью wxPython.Как создать окно с 3-мя панелями с помощью wxPython?

Я хочу иметь список деревьев в левой панели, а затем иметь правую панель, разделенную на две части - с компонентом редактирования в верхней части и компонентом сетки в нижней части.

Что-то вдоль линий:

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

Я хотел бы окно, чтобы быть повторно значительные и дают пользователю возможность изменять (относительно) размер каждого из компонентов в окнах путем перетаскивания границы.

Я полагаю, что мне нужна комбинация sizers и/или компонентов разделителя окон, но не может найти достойный пример такого окна в документации или в Интернете.

ответ

7

Прежде всего загрузить wxGlade a gui builder для wxPython (вариант XRCed, я предпочитаю wxGlade).

Тогда вам нужно решить, хотите ли вы использовать GridSizer или Splitter, и все готово. Ниже вы найдете оба (между Tree и правой стороной - GridSizer -> автоматически изменяется). Между Edit и GridCtrl - Sizer (ручной размер).

С уважением.

одна минута работы без ввода одной строки кода:

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

+2

ни wxGlade, ни XRCed не требуются для создания работоспособного решения. –

2

Вы могли бы рассмотреть возможность использования передовых модуль пользовательского интерфейса wx.aui, поскольку это позволяет очень легко создавать пользовательские интерфейсы, как это. Также пользователь может затем минимизировать, максимизировать и перетаскивать панели по мере их соответствия, или нет. Это довольно гибко. На самом деле мне проще выложить такой интерфейс с помощью aui toolkit, а не с сетками и сплиттерами. Кроме того, все причудливые кнопки делают приложения более крутыми. :)

В официальных демонстрациях есть хороший пример, называемый 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() 
+0

+1 для 'aui', он делает функциональный IDE-подобный макет легко – Kos