GTK检测从用户调整窗口大小
在GTK(或pygtk或gtkmm…)中 如何检测应用程序窗口已由用户手动调整大小,这通常是通过拖动窗口边缘来实现的GTK检测从用户调整窗口大小,gtk,signals,resize,Gtk,Signals,Resize,在GTK(或pygtk或gtkmm…)中 如何检测应用程序窗口已由用户手动调整大小,这通常是通过拖动窗口边缘来实现的 我需要找到一种方法来区分手动调整大小和源自gtk的调整大小,例如窗口内容的更改。在PyGTK中,我一直在关注窗口调整的expose\u事件,然后使用get\u allocation方法获取新的大小。您是否尝试连接到GDK\u CONFIGURE事件 在下面结账 “移动窗口”部分。该示例显示了一个回调在移动窗口时执行某些操作,但配置事件是一个用于移动、调整大小和堆栈顺序事件的综合事
我需要找到一种方法来区分手动调整大小和源自gtk的调整大小,例如窗口内容的更改。在PyGTK中,我一直在关注窗口调整的
expose\u事件,然后使用get\u allocation
方法获取新的大小。您是否尝试连接到GDK\u CONFIGURE事件
在下面结账
“移动窗口”部分。该示例显示了一个回调在移动窗口时执行某些操作,但配置事件是一个用于移动、调整大小和堆栈顺序事件的综合事件。您可以通过使用获取窗口的左上角并获取宽度和高度来将一些内容组合在一起。然后,您可以将回调挂接到GDK_BUTTON_PRESS_掩码中,并检查按钮按下是否发生在窗口的某个边缘附近/上
当然,这看起来很粗糙,我真的很困扰,因为我在GdkWindow的文档中找不到一些简单的方法来实现这一点。有一个函数真的让我觉得有一个更干净的方法可以做到这一点,但我没有看到比我的答案更明显的东西。我通过观察GtkWindow
上的size\u分配和size\u请求
信号成功地实现了这一点。如果size\u请求
变得更小,我会调用resize(1,1)
。如果size\u allocate
比预期的要大,我就关闭了系统
我确保处理的一件事是size\u请求
先返回大的,然后返回小的,然后让size\u分配
先大后小。我不知道这是否可行,但我修复了它,确保只有当我得到一个较小的size\u allocate
时,才降低size\u allocate
的预期值,而不是当我得到一个较小的size\u请求时
确保size\u请求的处理程序位于基类的处理程序之后,以便获得正确的值。为此,我先重写该方法,然后调用基类方法
我在1维和2维两个维度上都尝试过这个方法,但它似乎都能起作用。在我的例子中,我试图区分用户调整Gtk.Paned的大小和用户调整整个窗口的大小。两者都发出了notify::position
信号
我的解决方案是,因为我不知道用户是否正在从窗口小部件调整窗口大小,所以颠倒我想知道的。记录用户是否重新定位了小部件,如果用户没有在我的小部件上启动更新,则忽略更新
也就是说,我没有测试“窗口是否被调整大小”,而是在本地记录了按钮按下事件和按钮释放事件,这样我就可以测试“小部件是否被重新定位”
从gi.repository导入Gtk
类别MyPaned(Gtk.Paned):
_用户激活=错误
def on_位置(自、自、gparamspec):
如果激活了self.\u user\u:
#小部件触摸
其他:
#窗口大小调整(可能)
def on_按钮_按下(自身,*_):
self.\u user\u activated=True
def on_按钮_释放(自身,*41;:
self.\u user\u activated=False
开发初始化(self,*args):
super(MyPaned,self)。\uuuu init\uuuuu(*args)
self.connect('notify::position',self.on_position)
自我连接(“按钮按下事件”,自我打开按钮按下)
自连接(“按钮释放事件”,自启动按钮释放)
通过记录用户开始和结束与我的小部件直接交互的时间,我可以假设剩余的时间是由于窗口被调整了大小。(直到我找到更多案例)我正在查看GdkEventExpose结构…是发送事件字段告诉我是用户做的吗?实际上,您可能希望配置事件,而不是事件公开。。。我的错。我认为移动和调整大小都需要这样做,所以如果你感兴趣的话,你必须记住之前的大小。你找到了一种方法吗?没有。如果我找到了,它会显示在这里。下面的代码适用于此:g_信号连接(g_对象(窗口),“配置事件”,g_回调(回调函数),NULL;我认为您可以使用“检查调整大小”而不是“配置事件”,但这并没有提供一种方法来检查发生了什么类型的事件:调整大小或移动。因此,如果用户没有找到某种方法来确定这一点,那么肯定会产生虚假的结果@boldnik:根据这一点,这将不起作用,因为它会激发其他各种原因:给定的链接已失效,编辑队列已满。下面是给出的示例的当前链接:在API参考中哪里可以找到notify::position
?@buhtz我想我在野外偶然发现了一个“notify::”示例,我推断了Lazka令人敬畏的PGI文档的其余部分:@thorCaller在文档中我找不到notify:*
事件。这就是我想知道的原因。建议的编辑队列是full@ThorSummoner是的,我想在您的代码片段中添加python3语法高亮显示,但SE告诉我您答案的编辑队列已满。