我怎样才能使一个wxpython小部件跨越两个单元格而不将其他小部件推到一边?

我怎样才能使一个wxpython小部件跨越两个单元格而不将其他小部件推到一边?,python,user-interface,wxpython,Python,User Interface,Wxpython,我正在尝试创建一个包含多个输入字段的表单。在这些字段下面,我希望有一个wxpython最终列表控件(出于所有目的,它与列表控件是一样的)。我的问题是尺寸。为了提供一些上下文,我的表单如下所示 Name [TextCtrl] Blah [TextCtrl] ListControl 我想让它看起来像 Name [TextCtrl] Blah [TextCtrl] ListCtrl (this spans to the end of the row) 我的

我正在尝试创建一个包含多个输入字段的表单。在这些字段下面,我希望有一个wxpython最终列表控件(出于所有目的,它与列表控件是一样的)。我的问题是尺寸。为了提供一些上下文,我的表单如下所示

Name         [TextCtrl]
Blah         [TextCtrl]

ListControl
我想让它看起来像

Name   [TextCtrl]
Blah   [TextCtrl]
ListCtrl (this spans to the end of the row)
我的问题是当我尝试添加列表控件时。我希望列表控件从静态文本扩展到文本控件,但它将文本控件推到另一个控件上。有人能给我指一下正确的方向吗?我已在下面附上相关代码

class UserField(wx.Dialog):
def __init__(self, parent):
    wx.Dialog.__init__(self, parent=parent, title="Info", size=(350, 400),
                       style=wx.DEFAULT_FRAME_STYLE)


    self.init_ui()
    self.Center()
    self.ShowModal()

def init_ui(self):
    panel = wx.Panel(self, wx.ID_ANY)
    hbox = wx.BoxSizer(wx.VERTICAL)
    flex_grid = wx.FlexGridSizer(5, 2, 5, 10) # row, col, vgap, hgap


    info_text = wx.StaticText(parent=panel, label="Enter information")
    self.search_button = wx.Button(parent=panel, label="Search")
    self.list_control = UltimateListCtrl(panel,
        agwStyle=wx.LC_REPORT | wx.BORDER_SUNKEN | ULC_HAS_VARIABLE_ROW_HEIGHT, )

    flex_grid.AddMany(
            [
                info_text, self.search_button
            ]
    )
    lbox = wx.BoxSizer(wx.HORIZONTAL)
    lbox.Add(self.list_control
    hbox.Add(flex_grid, wx.EXPAND|wx.ALL)
    hbox.Add(lbox, proportion=1, flag=wx.ALL|wx.EXPAND)
    panel.SetSizer(hbox)

下面是
wx.GridBagSizer
的快速演示。程序用一个按钮打开一个简单的框架,生成一个带有
GridBagSizer
的对话框。您可以根据位置(
pos
)将项目放置在大小调整器中,还可以选择允许小部件跨越多行和/或多列(
span

导入wx 类示例(wx.Frame): 定义初始化(self,*args,**kwargs): wx.Frame.\uuuuu初始化(self,*args,**kwargs) 自我设置大小((300200)) 自我中心() 自我展示(真实) self.InitUI() def InitUI(self): 面板=wx.面板(自) sizer=wx.BoxSizer() btn=wx.按钮(面板,label=“生成窗口”) 绑定(wx.EVT_按钮,self.spawn_窗口) sizer.Add(btn) 面板.设置尺寸(施胶器) def生成窗口(自身、evt): 用户字段(self) def OnQuit(自我,e): self.Close() 类用户字段(wx.Dialog): 定义初始化(自身,父级): 对话框。初始化(self,parent=parent,title=“Info”,size=(350400), 样式=wx。默认(框架样式) self.init_ui() self.Center() self.ShowModal() def初始用户界面(自身): 面板=wx.面板(自) sizer=wx.GridBagSizer(10,10) field1Label=wx.StaticText(面板,label=“字段1”) field2Label=wx.StaticText(面板,label=“Field 2”) field1Ctrl=wx.TextCtrl(面板) field2Ctrl=wx.TextCtrl(面板) listCtrl=wx.listCtrl(面板) sizer.Add(field1Label,pos=(0,0)) sizer.Add(field2Label,pos=(1,0)) sizer.Add(field1Ctrl,pos=(0,1)) sizer.Add(field2Ctrl,pos=(1,1)) #这是重要的一句话。请注意“span”参数: sizer.Add(listCtrl,pos=(2,0),span=(1,2),flag=wx.EXPAND) 面板.设置尺寸(施胶器) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': ex=wx.App() 大型机=示例(无) 例如MainLoop()
要使控件跨越两列,请尝试使用
GridBagSizer
span=(1,2)
。另外,请修复缩进。谢谢,你能给我一个简单的例子吗,我在使用它时有点困难,我需要添加一个grow列吗?非常感谢,我以前从未使用过在框架中包含对话框的方法,这就是应该做的吗?我绝对不是这个理论的专家;这正是我根据自己的应用程序所做的。我制作了一个包含所有主要功能的主框架。但这完全取决于你想做什么。 import wx class Example(wx.Frame): def __init__(self, *args, **kwargs): wx.Frame.__init__(self, *args, **kwargs) self.SetSize((300, 200)) self.Centre() self.Show(True) self.InitUI() def InitUI(self): panel = wx.Panel(self) sizer = wx.BoxSizer() btn = wx.Button(panel, label="Spawn Window") btn.Bind(wx.EVT_BUTTON, self.spawn_window) sizer.Add(btn) panel.SetSizerAndFit(sizer) def spawn_window(self, evt): UserField(self) def OnQuit(self, e): self.Close() class UserField(wx.Dialog): def __init__(self, parent): wx.Dialog.__init__(self, parent=parent, title="Info", size=(350, 400), style=wx.DEFAULT_FRAME_STYLE) self.init_ui() self.Center() self.ShowModal() def init_ui(self): panel = wx.Panel(self) sizer = wx.GridBagSizer(10, 10) field1Label = wx.StaticText(panel, label="Field 1") field2Label = wx.StaticText(panel, label="Field 2") field1Ctrl = wx.TextCtrl(panel) field2Ctrl = wx.TextCtrl(panel) listCtrl = wx.ListCtrl(panel) sizer.Add(field1Label, pos=(0, 0)) sizer.Add(field2Label, pos=(1, 0)) sizer.Add(field1Ctrl, pos=(0, 1)) sizer.Add(field2Ctrl, pos=(1, 1)) # HERE'S THE IMPORTANT LINE. NOTE THE 'span' ARGUMENT: sizer.Add(listCtrl, pos=(2, 0), span=(1, 2), flag=wx.EXPAND) panel.SetSizerAndFit(sizer) if __name__ == '__main__': ex = wx.App() mainFrame = Example(None) ex.MainLoop()