我想检测用户何时完成重新调整大小或移动 GTK 窗口。基本上相当于 Windows 中的WM_EXITSIZEMOVE。
我已经查看了GTK 检测用户的窗口调整大小,并且能够使用配置事件检测大小/位置的变化;但是,由于我的其他代码是架构师,我想知道调整大小何时完成。几乎像 ValueChanged 而不是 ValueChanging 事件。
我在想如果我能找出鼠标按钮是否被释放,然后尝试检测它是否是我得到的最后一个事件。但是对于窗口对象也找不到这样做的方法。
我想检测用户何时完成重新调整大小或移动 GTK 窗口。基本上相当于 Windows 中的WM_EXITSIZEMOVE。
我已经查看了GTK 检测用户的窗口调整大小,并且能够使用配置事件检测大小/位置的变化;但是,由于我的其他代码是架构师,我想知道调整大小何时完成。几乎像 ValueChanged 而不是 ValueChanging 事件。
我在想如果我能找出鼠标按钮是否被释放,然后尝试检测它是否是我得到的最后一个事件。但是对于窗口对象也找不到这样做的方法。
您可以使用在调整大小完成后调用的超时函数。超时以毫秒为单位,您可能希望使用该值来平衡调用 resize_done 的延迟和在真正完成调整大小之前触发它。
#define TIMEOUT 250
gboolean resize_done (gpointer data)
{
guint *id = data;
*id = 0;
/* call your existing code here */
return FALSE;
}
gboolean on_configure_event (GtkWidget *window, GdkEvent *event, gpointer data)
{
static guint id = 0;
if (id)
g_source_remove (id);
id = g_timeout_add (TIMEOUT, resize_done, &id);
return FALSE;
}
我使用 PyGObject 和 Python 3 实现了一个解决方案(有些人称之为解决方法)。正如Phillip Wood在这个问题中和另一个问题中提到的棘轮怪胎,我也使用了基于计时器的解决方案。
在示例中,该size-allocate
事件用于检测窗口调整大小的开始。我假设用户在这里用鼠标拖动窗口边框。还有其他方法可以检测窗口调整大小事件:请参阅此处的讨论。
接下来,该事件断开连接,并作为代理创建一个计时器事件(GLib.timeout_add()
500 毫秒)来处理下一个内容。
这是示例代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import GLib
class MyWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
# close event
self.connect('delete-event', self._on_delete_event)
# "resize" event
self._connect_resize_event()
def _connect_resize_event(self):
self._timer_id = None
eid = self.connect('size-allocate', self._on_size_allocated)
self._event_id_size_allocate = eid
def _on_delete_event(self, a, b):
Gtk.main_quit()
def _on_size_allocated(self, widget, alloc):
print('EVENT: size allocated')
# don't install a second timer
if self._timer_id:
return
# remember new size
self._remembered_size = alloc
# disconnect the 'size-allocate' event
self.disconnect(self._event_id_size_allocate)
# create a 500ms timer
tid = GLib.timeout_add(interval=500, function=self._on_size_timer)
# ...and remember its id
self._timer_id = tid
def _on_size_timer(self):
# current window size
curr = self.get_allocated_size().allocation
# was the size changed in the last 500ms?
# NO changes anymore
if self._remembered_size.equal(curr): # == doesn't work here
print('RESIZING FINISHED')
# reconnect the 'size-allocate' event
self._connect_resize_event()
# stop the timer
self._timer_id = None
return False
# YES size was changed
# remember the new size for the next check after 500ms
self._remembered_size = curr
# repeat timer
return True
if __name__ == '__main__':
window = MyWindow()
window.show_all()
Gtk.main()