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)
您可以处理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以跟踪窗口位置。