2016-03-22 1 views
0

Я хотел был бы иметь возможность получить размер окна приложения и передать его другим модулям в приложении, и когда размер размера окна (скажем, , если пользователь изменяет размер окна), обновленный размер окна также передается другим модулям.wxPython: как обновить размер окна при изменении размера окна в реальном времени

Например, я попробовал что-то вроде кода ниже, где я попытался сохранить размер окна в 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() 

ответ

1

Необходимо сначала узнать, что дало вам это сообщение об ошибке в первую очередь. С вашим кодом как есть, поймите, что в методе __init__ атрибут size не был установлен нигде до того, как был вызван его foo, что дало вам эту ошибку.

Что вы хотите сделать, это отсрочить вызов foo вашему обработчику для EVT_SIZE, в данном случае OnSize. Событие будет вызываться, когда окно станет видимым, поскольку оно будет изменено до размера по умолчанию (таким образом, установка 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) 

Override foo позвонить в другое окно, или любой другой.