import wx
class MyFrame(wx.Frame):
def __init__(self, parent):
self.parent = parent
super(MyFrame, self).__init__(parent, -1, 'Test')
# create a base panel
self.panel = wx.Panel(self)
self.panel.SetBackgroundColour('blue')
vbox = wx.BoxSizer(wx.VERTICAL)
# create a sub-panel 1.
self.panel_1 = wx.Panel(self.panel, -1)
self.panel_1.SetBackgroundColour('yellow')
vbox.Add(self.panel_1, 1, wx.EXPAND)
# create a sub-panel 2.
self.panel_2 = wx.Panel(self.panel, -1)
self.panel_2.SetBackgroundColour('pink')
vbox.Add(self.panel_2, 1, wx.EXPAND)
# This line of code cause the problem!
self.panel.Bind(wx.EVT_SIZE, self._on_paint)
self.panel.SetSizer(vbox)
self.Show()
def _on_paint(self, e):
pass
app = wx.App()
frame = MyFrame(None)
app.MainLoop()
上面的脚本不会产生理想的输出,其中两个子面板的大小应该相等,并且一起占据所有帧。
理想的输出可以通过删除来实现:
self.panel.Bind(wx.EVT_SIZE, self._on_paint)
我还测试过,如果脚本是wx.EVT_PAINT而不是wx.EVT_SIZE,脚本可以正常工作。
那么,为什么上面的行导致sizer无法正常工作?
答案 0 :(得分:0)
因为基类中的默认EVT_SIZE
处理程序是执行使用sizer的自动布局的位置。通过使用您自己的处理程序拦截EVT_SIZE
事件,您将阻止该默认功能。
您可以在处理程序中调用e.Skip()
,以便事件处理系统在您完成后继续查找匹配的事件处理程序,或者您可以将以下代码添加到处理程序中,以便布局算法仍然是进行:
window = e.GetEventObject()
if window.GetAutoLayout():
window.Layout()