我有以下界面:
我的代码是这样的:
child_frame = wx.Frame(self, title="Extension Options", size = (200,400), style=self.child_window_style)
panel = wx.Panel(child_frame,-1)
top_title = wx.StaticText(panel, id = -1, label = "Image Extensions")
middle_title = wx.StaticText(panel, id = -1, label = "Document Extensions")
bottom_title = wx.StaticText(panel, id = -1, label = "Miscellaneous")
l = wx.StaticLine(panel, -1, style=wx.LI_HORIZONTAL, size = (200, 1))
l2 = wx.StaticLine(panel, -1, style=wx.LI_HORIZONTAL, size = (200, 1))
gif = wx.CheckBox(panel, label = ".gif")
jpg = wx.CheckBox(panel, label = ".jpg")
tif = wx.CheckBox(panel, label = ".tiff")
png = wx.CheckBox(panel, label = ".png")
word = wx.CheckBox(panel, label = "Word")
excel = wx.CheckBox(panel, label = "Excel")
access = wx.CheckBox(panel, label = "Access")
powerpoint = wx.CheckBox(panel, label = "Power")
line1_box = wx.BoxSizer(wx.HORIZONTAL)
line2_box = wx.BoxSizer(wx.HORIZONTAL)
#Create boxes
main_box = wx.BoxSizer(wx.VERTICAL)
img_box_title = wx.BoxSizer(wx.HORIZONTAL)# TITLE BOX
main_img_box = wx.BoxSizer(wx.HORIZONTAL)
img_box1 = wx.BoxSizer(wx.VERTICAL)
img_box2 = wx.BoxSizer(wx.VERTICAL)
doc_box_title = wx.BoxSizer(wx.HORIZONTAL)# TITLE BOX
main_doc_box = wx.BoxSizer(wx.HORIZONTAL)
doc_box1 = wx.BoxSizer(wx.VERTICAL)
doc_box2 = wx.BoxSizer(wx.VERTICAL)
misc_box_title = wx.BoxSizer(wx.HORIZONTAL)
#main_misc_box = wx.BoxSizer(wx.HORIZONTAL)
#Place elements to boxes
img_box_title.Add(top_title, 1, wx.ALIGN_CENTER|wx.ALL, 5)# ASSIGN TITLE
img_box1.Add(gif, 1, wx.ALIGN_LEFT|wx.ALL, 5)
img_box1.Add(jpg, 1, wx.ALIGN_LEFT|wx.ALL, 5)
img_box2.Add(tif, 1, wx.ALIGN_LEFT|wx.ALL, 5)
img_box2.Add(png, 1, wx.ALIGN_LEFT|wx.ALL, 5)
line1_box.Add(l, 0, wx.CENTER, 1)# LINE
doc_box_title.Add(middle_title, 1, wx.ALIGN_CENTER|wx.ALL, 5)# ASSIGN TITLE
doc_box1.Add(word, 1, wx.ALIGN_LEFT|wx.ALL, 5)
doc_box1.Add(access, 1, wx.ALIGN_LEFT|wx.ALL, 5)
doc_box2.Add(excel, 1, wx.ALIGN_LEFT|wx.ALL, 5)
doc_box2.Add(powerpoint, 1, wx.ALIGN_LEFT|wx.ALL, 5)
line2_box.Add(l2, 0, wx.CENTER, 1)# LINE
misc_box_title.Add(bottom_title, 1, wx.ALIGN_CENTER|wx.ALL, 5)# ASSIGN TITLE
#Place boxes
main_box.Add(img_box_title, 1, wx.ALIGN_CENTER, 5)# PLACE TITLE
main_box.Add(main_img_box, 1, wx.ALIGN_CENTER, 5)
main_img_box.Add(img_box1, 1, wx.ALIGN_CENTER, 5)
main_img_box.Add(img_box2, 1, wx.ALIGN_CENTER, 5)
main_box.Add(line1_box, 0, wx.ALIGN_CENTER, 0)# LINE
main_box.Add(doc_box_title, 1, wx.ALIGN_CENTER, 5)# PACE TITLE
main_box.Add(main_doc_box, 1, wx.ALIGN_CENTER, 5)
main_doc_box.Add(doc_box1, 1, wx.ALIGN_CENTER, 5)
main_doc_box.Add(doc_box2, 1, wx.ALIGN_CENTER, 5)
main_box.Add(line2_box, 0, wx.ALIGN_CENTER, 0)# LINE
main_box.Add(misc_box_title, 1, wx.ALIGN_CENTER, 5)# PACE TITLE
panel.SetSizer(main_box)
wx.Frame.CenterOnScreen(child_frame)
child_frame.Show()
有没有办法将“gif-jpg”与“word-access”对齐?
我可以把它变成静态窗口并使用pos,但我也想学习使用box sizer ...
答案 0 :(得分:0)
遗憾的是,没有方便的方法来对齐sizers中的项目。因此,您必须使用单个sizer,包括要对齐的元素以及它们之间的所有内容,在您的情况下,@ sebdelsol推荐的wxGridBagSizer
是唯一可以工作的sizer。
或者你可以略微帮助sizer布局算法。为此,您需要通过迭代应用于列中所有复选框的GetBestSize()
结果来计算列的最大宽度。然后你应该使用wxSizer::SetItemMinSize()为所有这些设置这个宽度,包括不同sizer中的宽度。
请注意,与上述内容无关,您可以使用wxFlexGridSizer而非许多box sizer来简化您的布局。
答案 1 :(得分:0)
这是一个棘手的问题(因为它嵌套得太深了)并且需要使用wx.lib.inspection。请参阅下面的代码最后三分之一的黑客攻击,这可以让您确定wx.ALIGN_CENTER
中的main_img_box
覆盖了wx.ALIGN_LEFT
中的img_box1/2
。您还需要wx.EXPAND
允许main_img_box
的元素填写1
给出的比例。需要wx.ALL
才能显示5
的边框。
…
# Hack to solve the posters problem. *DO NOT USE IN PRODUCTION CODE*
wx.ALIGN_CENTER = wx.EXPAND|wx.ALL
#Place boxes
…