我对wxPython比较新,我正在尝试构建一个GUI。这个想法如下:我想要彼此相邻的列。左列的宽度为总宽度的1/3,并包含垂直堆叠的按钮列表。右列具有剩余的2/3宽度,并包含两个垂直堆叠的staticTexts。
我尝试使用水平盒式分级器创建一个主面板,其中包含两个带垂直盒式分析器的面板。所有按钮(可能还有文本)似乎都堆叠在同一个地方。
我的代码:
wx.Frame.__init__(self, None, wx.ID_ANY, "Load coordinates", size=(600,600))
mainPanel = wx.Panel(self, wx.ID_ANY, size=(600,600))
btnPanel = wx.Panel(self, wx.ID_ANY, size=(600,300))
txtPanel = wx.Panel(self, wx.ID_ANY, size=(600,300))
# create the buttons and bindings
btn1 = wx.Button(btnPanel, 1, label="1")
btn2 = wx.Button(btnPanel, 2, label="2")
btn3 = wx.Button(btnPanel, 3, label="3")
btn4 = wx.Button(btnPanel, 4, label="4")
btn5 = wx.Button(btnPanel, 5, label="5")
# create static text field
text1 = wx.StaticText(txtPanel, 6)
# put the buttons in a sizer
btnSizer = wx.BoxSizer(wx.VERTICAL)
btnSizer.Add(btn1, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)
btnSizer.Add(btn2, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)
btnSizer.Add(btn3, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)
btnSizer.Add(btn4, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)
# create line for visual
btnLine = wx.StaticLine(self)
btnSizer.Add(btnLine, 1, wx.ALL|wx.LEFT|wx.EXPAND, 20)
# last button
btnSizer.Add(btn5, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)
# put text in a sizer
txtSizer = wx.BoxSizer(wx.VERTICAL)
txtSizer.Add(text1, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)
btnPanel.SetSizer(btnSizer)
txtPanel.SetSizer(txtSizer)
# add panels to main panel
mainSizer = wx.BoxSizer(wx.HORIZONTAL)
mainSizer.Add(btnPanel, 1, wx.EXPAND, 5)
mainSizer.Add(txtPanel, 1, wx.EXPAND, 5)
mainPanel.SetSizer(mainSizer)
有人能看出为什么这不能按预期工作吗?
答案 0 :(得分:0)
解决了这个问题。我不需要制作多个面板(虽然我不知道这是否有所不同)并且最重要的是我需要将sizer设置为Frame而不是面板,因此:
# faulty:
mainPanel.SetSizer(mainSizer)
# correct
self.SetSizer(mainSizer)
答案 1 :(得分:0)
实际上,您几乎总是将面板作为小部件的父级。这不仅可以在所有平台上提供正确的外观,还可以在小部件之间正确显示。此外,你不应该使用自己的ID,尤其是那些如此低的ID。这些id可能是由wxPython本身保留的,可能会导致一些非常奇怪的行为。
这是一个示例,说明如何做你想要的(或接近它):
import wx
########################################################################
class MyPanel(wx.Panel):
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent)
main_sizer = wx.BoxSizer(wx.HORIZONTAL)
btn_sizer = wx.BoxSizer(wx.VERTICAL)
txt_sizer = wx.BoxSizer(wx.VERTICAL)
for i in range(5):
btn = wx.Button(self, label='%s' % i)
btn_sizer.Add(btn, 0, wx.ALL|wx.LEFT)
txt = wx.TextCtrl(self, style=wx.TE_MULTILINE)
txt_sizer.Add(txt, 1, wx.EXPAND)
main_sizer.Add(btn_sizer, 1)
main_sizer.Add(txt_sizer, 2, wx.EXPAND)
self.SetSizer(main_sizer)
########################################################################
class MainFrame(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, title='Nesting Panels')
panel = MyPanel(self)
self.Show()
if __name__ == '__main__':
app = wx.App(False)
frame = MainFrame()
app.MainLoop()