我想知道框架何时调整大小,因此我可以保存大小并在下次启动应用程序时记住它。这是我的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)
答案 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专家,但看起来你在每次更新时重新打开文件。如果是这样,难怪它很慢!
始终保持文件打开状态。
仅在您的应用退出时写入文件。
您还可以查看wxWidget wxConfig类。
答案 3 :(得分:1)
您绝对不应该在每次调整大小时保存窗口几何体,通常只应在帧关闭时完成。如果你想要额外的安全性(但老实说,你如何设法在 Python 中崩溃?),你也可以调用你在EVT_TIMER
处理程序关闭帧时调用的相同函数。但窗口几何不是一个关键资源,所以我认为没有任何实际需要这样做。