当 wxPython 框架被调整大小时,最简单的监控方法是什么?

Hub*_*bro 2 python wxwidgets wxpython

我想知道何时调整了框架的大小,以便我可以保存大小并在下次启动应用程序时记住它。这是我的on_resize方法:

def on_resize(self, event):
    logic.config_set('main_frame_size',
                     (event.Size.width, event.Size.height))

    event.Skip()
Run Code Online (Sandbox Code Playgroud)

它是这样绑定的:

self.Bind(wx.EVT_SIZE, self.on_resize)
Run Code Online (Sandbox Code Playgroud)

问题是性能。为了安全起见,我的逻辑模块会在每次设置更改时保存配置文件,并且每次触发调整大小事件时都写入配置文件会影响性能。

当用户完成调整框架大小时,最好/最简单的监视方法是什么


更新

我的config_set功能:

def config_set(key, value):
    """Set a value to the config file."""
    vprint(2, 'Setting config value: "{}": "{}"'.format(key, value))

    config[key] = value

    # Save the config file.
    with open(config_file_path, 'w') as f:
        pickle.dump(config, f)
Run Code Online (Sandbox Code Playgroud)

Ano*_*ard 5

您可以处理EVT_IDLE事件队列为空时触发的事件:

wx.IdleEvent:此类用于 EVT_IDLE 事件,当应用程序空闲时生成并发送这些事件。换句话说,当事件队列变空时,空闲事件被发送到所有窗口(默认情况下),只要它们都没有调用 RequestMore 那么就不会再有空闲事件,直到系统事件队列有一些正常事件和然后再次变空。

调整窗口大小或移动窗口的过程应保持事件队列阻塞,以便在调整大小/移动完成之前它不会变空(并触发空闲事件)。

设置一个脏标志EVT_SIZE并在EVT_IDLE处理程序中检查它。如果设置了标志,则保存新大小并重置标志:

import wx

class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None)
        self.resized = False # the dirty flag
        self.Bind(wx.EVT_SIZE,self.OnSize)
        self.Bind(wx.EVT_IDLE,self.OnIdle)

    def OnSize(self,event):
        self.resized = True # set dirty

    def OnIdle(self,event):
        if self.resized: 
            # take action if the dirty flag is set
            print "New size:", self.GetSize()
            self.resized = False # reset the flag

app = wx.PySimpleApp()
frame = Frame().Show()
app.MainLoop()
Run Code Online (Sandbox Code Playgroud)

EVT_SIZE恢复最小化窗口时也可能触发(窗口大小保持不变)。如果您想减少不必要的保存,您可能需要在将其保存到配置之前检查大小是否实际不同(您可以在包含最后保存大小的变量中跟踪它)。

您可能想要添加EVT_MOVE以跟踪窗口位置。