我怎样才能使一个wxpython小部件跨越两个单元格而不将其他小部件推到一边?
我正在尝试创建一个包含多个输入字段的表单。在这些字段下面,我希望有一个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) 我的
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()