什么是监视wxPython帧大小时最简单的监视方式?

时间:2012-11-20 18:34:33

标签: python wxpython wxwidgets

我想知道框架何时调整大小,因此我可以保存大小并在下次启动应用程序时记住它。这是我的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)

问题在于表现。为了安全起见,我的逻辑模块会在每次设置更改时保存配置文件,并且每次调整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 个答案:

答案 0 :(得分:3)

您可以处理事件队列为空时触发的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以跟踪窗口位置。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

在没有注册表的其他操作系统上,我猜你需要使用一个文件。但是,我很惊讶即使这样也会给你注意到的性能损失。

你是否肯定你所看到的不良表现是由于这个原因? (也许你的重绘代码很慢?)

我认为任何现代操作系统都会照看这么小的文件,而不会妨碍你。也许是Python问题?

我建议你首先研究上述问题。但是,要回答您的实际问题:

执行此操作的方法是将窗口大小保存在变量中,并在应用程序退出时将其写入文件。


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

  1. 始终保持文件打开状态。

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

  3. 您还可以查看wxWidget wxConfig类。

答案 3 :(得分:1)

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