如何告知面板在使用wx.aui时正在调整大小

2 投票
1 回答
977 浏览
提问于 2025-04-15 12:14

我正在使用 wx.aui 来构建我的用户界面。我定义了一个类,这个类是从 wx.Panel 继承而来的。当窗口的面板大小改变时,我需要更改这个面板的内容。

我使用的代码和下面的代码非常相似(这是一个修改过的示例代码,来源于 这里)。

我的问题是:AuiManager 背后是否有一个 wx.Panel 的方法可以被我重写?如果没有,我的 ControlPanel 对象怎么知道它的大小被改变了呢?

举个例子,如果我运行这段代码,然后拖动右侧上下面板之间的水平分隔线,怎么让右上角的面板知道它的大小刚刚改变了呢?

import wx
import wx.aui

class ControlPanel(wx.Panel):
    def __init__(self, *args, **kwargs):
        wx.Panel.__init__(self, *args, **kwargs)

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        self.mgr = wx.aui.AuiManager(self)

        leftpanel = ControlPanel(self, -1, size = (200, 150))
        rightpanel = ControlPanel(self, -1, size = (200, 150))
        bottompanel = ControlPanel(self, -1, size = (200, 150))

        self.mgr.AddPane(leftpanel, wx.aui.AuiPaneInfo().Bottom())
        self.mgr.AddPane(rightpanel, wx.aui.AuiPaneInfo().Left().Layer(1))
        self.mgr.AddPane(bottompanel, wx.aui.AuiPaneInfo().Center().Layer(2))

        self.mgr.Update()


class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, '07_wxaui.py')
        frame.Show()
        self.SetTopWindow(frame)
        return 1

if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()

1 个回答

3

根据wx.Panel的文档,当窗口大小改变时,wx.Panel.Layout会被默认的EVT_SIZE处理程序自动调用。

编辑:不过,上面的说法并没有像我预期的那样工作,所以可以尝试手动绑定EVT_SIZE:

class ControlPanel(wx.Panel):
    def __init__(self, *args, **kwargs):
        wx.Panel.__init__(self, *args, **kwargs)
        self.Bind(wx.EVT_SIZE, self.OnResize)

    def OnResize(self, *args, **kwargs):
        print "Resizing"

撰写回答