我有一些奇怪的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()是否始终存在?
由于
答案 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后重新计算面板的布局:
panel.SetSizer(sizer)
panel.Layout()