2009-08-14 17 views
10

Mam kilka przycisków w różnych rozmiarach i rozwijają się w taki sposób, w jaki chcę. Jednak po dodaniu obiektu nadrzędnego do nowego obiektu wx.BoxSizer, który jest używany do dodawania obramowania wokół wszystkich elementów w ramce, dodany moduł pomocniczy działa poprawnie w pionie, ale nie w poziomie.wxPython: Elementy w BoxSizerze nie rozszerzają się poziomo, tylko pionowo

Poniższy kod demonstruje problem:

#! /usr/bin/env python 

import wx 
import webbrowser 

class App(wx.App): 


    def OnInit(self): 
     frame = MainFrame() 
     frame.Show() 
     self.SetTopWindow(frame) 
     return True 


class MainFrame(wx.Frame): 

    title = 'Title' 


    def __init__(self): 
     wx.Frame.__init__(self, None, -1, self.title) 

     panel = wx.Panel(self) 

     #icon = wx.Icon('icon.png', wx.BITMAP_TYPE_PNG) 
     #self.SetIcon(icon) 

     sizer = wx.FlexGridSizer(rows=2, cols=1, vgap=10, hgap=10) 

     button1 = wx.Button(panel, -1, 'BUTTON') 
     sizer.Add(button1, 0, wx.EXPAND) 

     buttonSizer = wx.FlexGridSizer(rows=1, cols=4, vgap=10, hgap=5) 

     buttonDelete = wx.Button(panel, -1, 'Delete') 
     buttonSizer.Add(buttonDelete, 0, 0) 

     buttonEdit = wx.Button(panel, -1, 'Edit') 
     buttonSizer.Add(buttonEdit, 0, 0) 

     buttonNew = wx.Button(panel, -1, 'New') 
     buttonSizer.Add(buttonNew, 0, 0) 

     buttonSizer.AddGrowableCol(0, 0) 

     sizer.Add(buttonSizer, 0, wx.EXPAND|wx.HORIZONTAL) 

     sizer.AddGrowableCol(0, 0) 
     sizer.AddGrowableRow(0, 0) 

     mainSizer = wx.BoxSizer(wx.EXPAND) 
     mainSizer.Add(sizer, 0, wx.EXPAND|wx.ALL, 10) 

     #panel.SetSizerAndFit(sizer) 
     #sizer.SetSizeHints(self) 
     panel.SetSizerAndFit(mainSizer) 
     mainSizer.SetSizeHints(self) 


if __name__ == '__main__': 
    app = App(False) 
    app.MainLoop() 

zakomentowanie linie i i odkomentowanie linie i usuwa dodatkowy BoxSizer i pokazuje, w jaki sposób mogę się spodziewać wszystkiego funkcjonować (oczywiście bez białych znaków).

Całkowicie utknąłem z powodu tego problemu i nadal nie mam pojęcia, jak to naprawić.

Odpowiedz

24

Po pierwsze niepoprawnie przekazujesz niektóre flagi. BoxSizer przyjmuje wx.HORIZONTAL lub wx.VERTICAL, a nie wx.EXPAND. sizer.Add nie bierze wx.HORIZONTAL.

Jeśli masz VERTICAL BoxSizer, wx.EXPAND sprawi, że kontrola wypełni się poziomo, a proporcja 1 lub więcej (drugi argument do Dodaj) sprawi, że kontrola wypełni się pionowo. Jest odwrotnie w przypadku HORIZONTAL BoxSizers.

sizer = wx.BoxSizer(wx.VERTICAL) 
sizer.Add(widget1, 0, wx.EXPAND) 
sizer.Add(widget2, 1) 

Widżet1 zostanie rozwinięty w poziomie. widget2 zostanie rozwinięty pionowo.

Jeśli umieścisz sizer w innym segregatorze, musisz upewnić się, że ustawiono proporcje i flagi EXPAND, tak aby jego wnętrze rosło, jak chcesz.

Resztę zostawiam Tobie.

Powiązane problemy