wxpython boxsizer: проблемы с динамическим добавлением элементов
Это сводит меня с ума. Я обычно использую Tkinter для графического интерфейса, но мне просто хотелось изучить wxpython.
Я не могу понять, почему, когда я добавляю такие элементы, как кнопки или статический текст, на панель, используя boxsizer. Просто кажется, что все втиснуто в положение (0,0) на панели, называемой "сторона", вот мой код.
import wx
def AddUser():
ex = wx.App()
Stylex = wx.SYSTEM_MENU|wx.CAPTION|wx.CLOSE_BOX
window = wx.Frame(None, style=Stylex)
splitter = wx.SplitterWindow(window, -1)
vbox = wx.BoxSizer(wx.VERTICAL)
"""
LEFT PANEL... Contains Navigation Tree
"""
fgs = wx.FlexGridSizer(2,1,5,10) # fgs(int rows, int cols, int vgap, int hgap
panel = wx.Panel(splitter, -1)
panel.SetBackgroundColour('#ededed')
side = wx.Panel(splitter, -1)
side.SetBackgroundColour('#4f5049')
multi_btn = wx.Button(panel, label="Batch User Mode")
multi_btn.SetId(50)
single_btn = wx.Button(panel, label="Single User Mode")
single_btn.SetId(25)
items = [multi_btn,single_btn]
fgs.AddMany(items)
vbox.Add(fgs)
panel.SetSizer(vbox)
splitter.SplitVertically(panel, side,100)
"""
SIDE panel... Contains all widgets
"""
st = wx.StaticText(side, label="Select a Mode", pos=wx.Point(20,100))
st.SetForegroundColour(wx.WHITE)
def SetMode(event):
"""
25 returned if Single user mode
50 returned if Batch user mode
"""
MODE = event.GetId()
if MODE == 25:
try:
side.DestroyChildren()
except: pass
"""
Problem adding items to the dynamnic changing 'SIDE' panel
"""
vb = wx.BoxSizer(wx.VERTICAL)
stFName = wx.StaticText(side, id=2,label="First Name:")
stFName.SetForegroundColour(wx.WHITE)
vb.Add(stFName)
tcFName = wx.TextCtrl(side, id=4)
vb.Add(tcFName)
stLName = wx.StaticText(side,id=6, label="Last Name:")
vb.Add(stLName)
tcLName = wx.TextCtrl(side, id=8)
vb.Add(tcLName)
vb.Add(side, 1, flag=wx.EXPAND|wx.ALL, border=5)
side.SetSizer(vb)
"""
END Problem
"""
if MODE == 50:
try:
side.DestroyChildren()
except: pass
"""
do the same thing as single user creation, except adding listboxes instead of textctrl's
"""
return
multi_btn.Bind(wx.EVT_BUTTON, SetMode)
single_btn.Bind(wx.EVT_BUTTON, SetMode)
window.SetTitle('User Creation Process')
window.Centre()
window.Show(True)
ex.MainLoop()
if __name__=='__main__':
AddUser()
Большое спасибо за любую помощь... Я уверен, что это что-то маленькое, что я упустил из виду, но я хотел бы понять, если это фундаментальная проблема.
похотливый
1 ответ
Это размещение по умолчанию. Размеры НЕ для абсолютного позиционирования. Если вы хотите, вы можете сделать это, передавая позицию в каждом виджете. Если вы хотите, чтобы ваши виджеты центрировались слева, вам нужно расположить вертикальный BoxSizer внутри горизонтального и центрировать его. Или вы можете использовать пару разделителей, используя AddSpacer или просто добавив размер:
mySizer.Add((10, 20), 0, wx.ALL, 5)
Вы также можете использовать параметр "border" метода Add в Sizer, чтобы в некоторой степени управлять размещением, используя wx.TOP, wx.BOTTOM, wx.RIGHT или wx.LEFT и предоставляя ему необходимый объем пространства. Если вы видите, как виджеты складываются, вам нужно добавить вызов Layout в конце (возможно, с панели или из фрейма).
ОБНОВЛЕНИЕ: Если вы хотите поменять панели, я бы рекомендовал просто скрыть и показать их или уничтожить и создать панели. Я написал учебник по переключению панелей, который может помочь: http://www.blog.pythonlibrary.org/2010/06/16/wxpython-how-to-switch-between-panels/