wxpython creataStatusBar奇怪的行为

时间:2012-12-21 19:14:24

标签: python wxpython

我有一些奇怪的wxpython代码..这是OKAY代码:

class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title,size=(500, 300))
        self.CreateStatusBar() 
        panel = wx.Panel(self)

        self.srcSizer = wx.BoxSizer(wx.HORIZONTAL)
        srcButton = wx.Button(panel, wx.ID_ANY, "src")
        srcButton.Bind(wx.EVT_BUTTON, self.onSrcButton)
        self.srcSizer.Add(srcButton, 0)
        self.srcTxt = wx.TextCtrl(panel, wx.ID_ANY)
        self.srcSizer.Add(self.srcTxt, 1, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=10)

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.srcSizer, 0 , flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, border=10)


        panel.SetSizer(self.sizer)
        self.Show(True)

现在当我交换创建状态栏和面板的两行时它们变成

panel = wx.Panel(self)
self.CreateStatusBar() 

然后在加载窗口时按钮和textctrl重叠,并在手动调整窗口大小时将它们恢复到正常位置!!

在创建面板之前,self.CreatStatusBar()是否始终存在?

由于

1 个答案:

答案 0 :(得分:3)

CreateStatusBar()触发框架上的resize事件,为状态栏腾出空间。如果已创建面板,则会调整其大小以适合客户端 框架的区域。调整面板大小会触发面板上的resize事件,然后重新调整其布局(sizer)(如果适用)。

创建控件(要添加到面板的sizer中)只需将它们置于默认位置(0,0)并使用其默认大小。他们会要求 布局(sizer)更新要移动到正确的位置。 (这就是问题出现时左上角有一堆控件的原因。)

显示帧时,会再次触发resize事件。但是,如果面板已经适合框架的客户区域,则不会触发面板的调整大小事件, 因此它的布局不会更新。

即使没有状态栏,您也可以通过创建具有客户区大小的面板来观察该效果:

panel = wx.Panel(self,size=self.GetClientSize())
#self.CreateStatusBar()

同样,您可以通过将面板的大小设置为其他内容来触发更新(一旦显示框架,它将再次调整面板大小):

# at the end of __init__
panel.SetSize(0,0)

但是,这会产生不必要的调整大小:首先是手动SetSize(),再次是frame.Show()。有一种更好的方法(如下所示)。

wx 2.8中,此问题也适用于CreateToolBar()wx 2.9.4似乎可以正确处理工具栏。


作为一种解决方法,您可以:

  • 创建工具栏/状态栏之前创建面板 之后设置面板的sizer(需要将控件添加到sizer中)第一)
  • 设置sizer后重新计算面板的布局:

    panel.SetSizer(sizer)
    panel.Layout()