<p>我建议您使用<a href="https://bitbucket.org/repo/all/?name=wxglade" rel="nofollow noreferrer">wxglade</a>来设计gui。它是快速和有效的,在你有一些经验后,你可以做你可以手动做的大部分事情。在</p>
<p>wxglade没有wx.lib文件小部件,如您正在使用的<code>CheckListCtrlMixin</code>或<code>ListCtrlAutoWidthMixin</code>,或组合,如您的类<code>CheckListCtrl</code>。在</p>
<p>为了能够使用这些工具,可以用一个可用的小部件(p.e.awx.面板)然后,在生成代码之后,手动替换wx.面板使用特殊类或自定义类的实例化。在</p>
<p>最后,您的代码有一些产生异常的主要问题,例如wx.框架(用于wx.框架),错误的缩进或未定义的测试列表。MainGUI类没有<code>__init__</code>方法,也没有初始化父类<code>wx.Frame</code>。另外,<code>bottomPanel</code>被添加到<code>hbox</code>大小器中,而不是{<cd8>}。在</p>
<p>您编写的组织不会生成您所描述的GUI结构,而是生成两个面板(包含多个小部件)的GUI结构:</p>
<p><img src="https://i.stack.imgur.com/PLyWU.png" alt="enter image description here"/></p>
<p>为了更接近您的描述,您至少需要添加两个额外的sizer。
使用wxglade,它会为你做一切。在</p>
<p>这里有wxglade为类似于您的设计生成的代码(用您的<code>CheckListCtrl</code>替换<code>wx.ListCtrl</code>:</p>
<pre><code>#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
# generated by wxGlade HG on Tue Oct 04 12:45:03 2011
import wx
# begin wxGlade: extracode
# end wxGlade
class MainGUI(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: MainGUI.__init__
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.button_3 = wx.Button(self, -1, "Select All")
self.button_4 = wx.Button(self, -1, "DeselectAll")
self.list_ctrl_1 = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER)
self.text_ctrl_1 = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE)
self.button_1 = wx.Button(self, -1, "Refresh")
self.button_2 = wx.Button(self, -1, "Execute")
self.text_ctrl_2 = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE)
self.__set_properties()
self.__do_layout()
# end wxGlade
def __set_properties(self):
# begin wxGlade: MainGUI.__set_properties
self.SetTitle("frame_1")
self.SetBackgroundColour(wx.Colour(255, 170, 5))
self.list_ctrl_1.SetMinSize((200, 264))
# end wxGlade
def __do_layout(self):
# begin wxGlade: MainGUI.__do_layout
sizer_1 = wx.BoxSizer(wx.VERTICAL)
sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
sizer_3 = wx.BoxSizer(wx.VERTICAL)
sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
sizer_4.Add(self.button_3, 0, wx.ALL, 5)
sizer_4.Add(self.button_4, 0, wx.ALL, 5)
sizer_4.Add((20, 20), 1, wx.EXPAND, 0)
sizer_1.Add(sizer_4, 0, wx.EXPAND, 0)
sizer_2.Add(self.list_ctrl_1, 0, wx.ALL|wx.EXPAND, 5)
sizer_2.Add(self.text_ctrl_1, 0, wx.ALL|wx.EXPAND, 5)
sizer_3.Add(self.button_1, 0, wx.ALL, 5)
sizer_3.Add(self.button_2, 0, wx.ALL, 5)
sizer_2.Add(sizer_3, 0, wx.EXPAND, 0)
sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
sizer_1.Add(self.text_ctrl_2, 0, wx.ALL|wx.EXPAND, 5)
self.SetSizer(sizer_1)
sizer_1.Fit(self)
self.Layout()
# end wxGlade
# end of class MainGUI
if __name__ == "__main__":
app = wx.PySimpleApp(0)
wx.InitAllImageHandlers()
frame_1 = MainGUI(None, -1, "")
app.SetTopWindow(frame_1)
frame_1.Show()
app.MainLoop()
</code></pre>
<p>以及外观:</p>
<p><img src="https://i.stack.imgur.com/2P6Rs.png" alt="enter image description here"/></p>
<p>请注意,正如在另一个答案中所说的,没有必要将小部件放入面板(<code>widget(panel,..)</code>)中,面板也不需要放在尺寸器中。它可以工作,但最好是将小部件(作为frame->;<code>widget(self,..)</code>)放入sizer(<code>sizerx.Add(widget,..)</code>)中,将sizer放入sizers(<code>sizery.Add(sizerx)</code>)中来构建结构。<br/>
通常不修改此代码。相反,您可以将其子类化以添加您的功能或任何您需要的花哨的添加。通过这种方式,您可以始终再次使用wxglade来更改小部件的位置,或者添加其他小部件或大小调整器并重新生成整个文件。在</p>