GTK检测窗口从用户调整大小

Dre*_*ann 17 gtk signals resize

在GTK(或pygtk或gtkmm ...)

如何检测用户手动调整应用程序窗口的大小,通常通过拖动窗口的边缘来完成?

我需要找到一种方法来区分手动调整大小和源自gtk的调整大小,例如窗口内容的更改.

luk*_*uke 8

您是否尝试过连接GDK_CONFIGURE事件?

在"移动窗口"部分下查看此示例.该示例显示了在移动窗口时执行某些操作的回调,但configure事件是移动,调整大小和堆栈顺序事件的全能.

  • 以下代码适用于此: g_signal_connect(G_OBJECT(window), "configure-event", G_CALLBACK(callback_func), NULL); (2认同)

cla*_*hey 7

我设法通过观察size_allocatesize_request发出信号来解决这个问题GtkWindow.如果size_request变小了,我打电话给resize(1,1).如果size_allocate比预期更大,我关闭了系统.

我确定要做的一件事就是size_request返回大,然后小,然后size_allocate变大,然后变小.我不知道这是否可能,但我确定只是减少了size_allocate当我变小时的预期值size_allocate,而不是当我变小时size_request.

确保您的size_request处理程序位于基类的处理程序之后,以便您获得正确的值.我通过重写方法然后首先调用基类方法来做到这一点.

我在1维和2维都试过这个,但它似乎都有效.


Tho*_*ner 5

在我的例子中,我试图区分用户调整 Gtk.Paned 的大小和用户调整整个窗口的大小。两者都发出了notify::position信号。

我的解决方案是,由于我不知道用户是否正在从小部件调整窗口大小,因此反转我想知道的内容。记录用户是否重新定位了小部件,如果用户没有在我的小部件上启动更新,则忽略更新。

也就是说,我没有测试“是否调整窗口大小”,而是在本地记录button-press-eventbutton-release-event,因此我可以测试“是否重新定位小部件”

from gi.repository import Gtk

class MyPaned(Gtk.Paned):
    _user_activated = False

    def on_position(self, _, gparamspec):
        if self._user_activated:
            # widget touched

        else:
            # window resized (probably)

    def on_button_press(self, *_):
        self._user_activated = True

    def on_button_release(self, *_):
        self._user_activated = False


    dev __init__(self, *args):
        super(MyPaned, self).__init__(*args)
        self.connect('notify::position', self.on_position)
        self.connect('button-press-event', self.on_button_press)
        self.connect('button-release-event', self.on_button_release)

Run Code Online (Sandbox Code Playgroud)

通过记录用户何时开始和结束直接与我的小部件交互,我可以假设其余时间是由于窗口被调整大小。(直到我找到更多案例)

  • 如果有用户使用平铺窗口管理器,则此代码将无法按预期工作 (2认同)