WxPython: элементы в BoxSizer не расширяются горизонтально, только вертикально

У меня есть несколько кнопок в разных sizers, и они расширяются так, как я их хочу. Однако, когда я добавляю родительский элемент к новому wx.BoxSizer, который используется для добавления границы вокруг всех элементов в фрейме, добавленный элемент sizer работает правильно по вертикали, но не по горизонтали.

Следующий код демонстрирует проблему:

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

Комментируя строки 57 и 58, а неудовлетворительные строки 55 и 56 удаляет дополнительный BoxSizer и показывает, как Я ожидаю, что все будет работать (без пробелов, конечно).

Я полностью застрял в этой проблеме и до сих пор не знаю, как это исправить.

1 ответ

Прежде всего, вы неправильно переносите некоторые флаги. BoxSizer принимает wx.HORIZONTAL или wx.VERTICAL, а не wx.EXPAND. sizer.Add не принимает wx.HORIZONTAL.

Если у вас есть VERTICAL BoxSizer, wx.EXPAND сделает управление заполнением горизонтально, а доля 1 или более (второй аргумент для добавления) заставит элемент управления заполнить вертикально. Это противоположно для HORIZONTAL BoxSizers.

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

widget1 будет расширяться горизонтально. widget2 будет расширяться вертикально.

Если вы помещаете sizer в другой sizer, вы должны быть уверены, что его пропорция и флаги EXPAND установлены так, чтобы их внутренности увеличивались так, как вы хотите.

Я оставлю все остальное вам.

licensed under cc by-sa 3.0 with attribution.