5

我想检测用户何时完成重新调整大小或移动 GTK 窗口。基本上相当于 Windows 中的WM_EXITSIZEMOVE

我已经查看了GTK 检测用户的窗口调整大小,并且能够使用配置事件检测大小/位置的变化;但是,由于我的其他代码是架构师,我想知道调整大小何时完成。几乎像 ValueChanged 而不是 ValueChanging 事件。

我在想如果我能找出鼠标按钮是否被释放,然后尝试检测它是否是我得到的最后一个事件。但是对于窗口对象也找不到这样做的方法。

4

2 回答 2

2

您可以使用在调整大小完成后调用的超时函数。超时以毫秒为单位,您可能希望使用该值来平衡调用 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;
}
于 2013-09-29T13:14:38.933 回答
0

我使用 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()
于 2019-02-15T12:28:26.977 回答