3

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

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

    event.Skip()

它是这样绑定的:

self.Bind(wx.EVT_SIZE, self.on_resize)

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

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


更新

我的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)
4

4 回答 4

6

您可以处理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()

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

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

于 2012-11-21T04:05:37.613 回答
2

您可以启动一个计时器并让它每隔一段时间检查一次更改,有点像 Microsoft Word 中的自动保存。或者您可以在 EVT_SIZING 或 EVT_SIZE 发生时设置某种标志,然后绑定到 EVT_LEAVE_WINDOW,因为当您完成调整大小时您几乎肯定会离开窗口。因此,当该事件触发时,您检查已设置的标志,如果已设置,则保存并重置标志。

于 2012-11-20T20:23:20.390 回答
1

在 Windows 上,您可以将配置保存在注册表中,这样在调整窗口大小时不会影响性能。

在没有注册表的其他操作系统上,我想您需要使用文件。但是,令我惊讶的是,即使这样也会造成您会注意到的那种性能损失。

确定你看到的任何糟糕的表现都是因为这个吗?(也许你的重绘代码很慢?)

我认为任何现代操作系统都会在不妨碍您的情况下处理如此小的文件写入。也许是Python问题?

我敦促您先研究上述问题。但是,要回答您的实际问题:

这样做的方法是将窗口大小保存在一个变量中,并且仅在您的应用程序退出时将其写入文件。


看看你刚刚发布的代码。我不是 python 专家,但看起来你每次更新都重新打开文件。如果是这样,难怪它很慢!

  1. 始终保持文件打开。

  2. 仅在您的应用退出时写入文件。

您还可以查看 wxWidget wxConfig 类。

于 2012-11-20T18:46:58.790 回答
1

您绝对不应该在每次调整大小时保存窗口几何图形,通常应该只在框架关闭时完成。如果您想要额外的安全性(但是,老实说,您如何设法在Python中崩溃?),您还可以从EVT_TIMER处理程序调用在帧关闭时调用的相同函数。但是窗口几何图形几乎不是关键资源,所以我认为没有任何真正需要这样做。

于 2012-11-20T23:56:50.270 回答