wxPython:如何在 window 实时调整大小时更新 window 大小

wxPython: How to update window size as the window resizes in real-time

我希望能够获取应用程序的 window 大小并将其传递给应用程序中的其他模块,并且当 window 大小更新时(例如,如果用户调整大小window),更新后的 window 大小也会传递给其他模块。

例如,我尝试了类似下面的代码,我尝试将 window 大小存储在 self.size 中,以便它可以在 foo() 中使用。但是,这段代码会给我一条错误消息,说 'TestPanel' object has no attribute 'size。我想知道是否有办法做我想完成的事情。

import wx
class TestPanel(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)
        self.Bind(wx.EVT_SIZE, self.OnSize, self)
        self.foo()

    def Resize(self):
        self.size = self.GetSize()

    def OnSize(self, event):
        self.Resize()

    def foo(self):
        print(self.size)

if __name__ == '__main__':
    app = wx.App(False)
    f = wx.Frame(None, -1)
    TestPanel(f)
    f.Show()
    app.MainLoop()

您首先需要找出错误信息的来源。按原样使用您的代码,请注意,在 __init__ 方法中,size 属性在其 foo 被调用之前未在任何位置设置,从而给您带来该错误。

您想要做的是延迟对 EVT_SIZE 的处理程序 foo 的调用,在本例中为 OnSize。当 window 变为可见时将调用该事件,因为它将调整为默认大小(因此设置 self.size)。然后你可以简化你想做的事情:

class TestPanel(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)
        self.Bind(wx.EVT_SIZE, self.OnSize, self)

    def OnSize(self, event):
        self.size = self.GetSize()
        self.foo()

    def foo(self):
        print(self.size)

覆盖 foo 调用另一个 window 或其他。