Dre*_*ann 17 gtk signals resize
在GTK(或pygtk或gtkmm ...)
如何检测用户手动调整应用程序窗口的大小,通常通过拖动窗口的边缘来完成?
我需要找到一种方法来区分手动调整大小和源自gtk的调整大小,例如窗口内容的更改.
我设法通过观察size_allocate和size_request发出信号来解决这个问题GtkWindow.如果size_request变小了,我打电话给resize(1,1).如果size_allocate比预期更大,我关闭了系统.
我确定要做的一件事就是size_request返回大,然后小,然后size_allocate变大,然后变小.我不知道这是否可能,但我确定只是减少了size_allocate当我变小时的预期值size_allocate,而不是当我变小时size_request.
确保您的size_request处理程序位于基类的处理程序之后,以便您获得正确的值.我通过重写方法然后首先调用基类方法来做到这一点.
我在1维和2维都试过这个,但它似乎都有效.
在我的例子中,我试图区分用户调整 Gtk.Paned 的大小和用户调整整个窗口的大小。两者都发出了notify::position信号。
我的解决方案是,由于我不知道用户是否正在从小部件调整窗口大小,因此反转我想知道的内容。记录用户是否重新定位了小部件,如果用户没有在我的小部件上启动更新,则忽略更新。
也就是说,我没有测试“是否调整窗口大小”,而是在本地记录button-press-event和button-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)
通过记录用户何时开始和结束直接与我的小部件交互,我可以假设其余时间是由于窗口被调整大小。(直到我找到更多案例)