当我将size_event绑定到处理函数时,为什么wxPython中的sizer不起作用?

时间:2015-05-19 13:27:48

标签: wxpython

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无法正常工作?

1 个答案:

答案 0 :(得分:0)

因为基类中的默认EVT_SIZE处理程序是执行使用sizer的自动布局的位置。通过使用您自己的处理程序拦截EVT_SIZE事件,您将阻止该默认功能。

您可以在处理程序中调用e.Skip(),以便事件处理系统在您完成后继续查找匹配的事件处理程序,或者您可以将以下代码添加到处理程序中,以便布局算法仍然是进行:

  window = e.GetEventObject()
  if window.GetAutoLayout():
      window.Layout()