Python gtk3窗口监听输入事件 [英] Python gtk3 window listen to input events

查看:0
本文介绍了Python gtk3窗口监听输入事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法让python gtk3窗口捕获其中键盘和/或鼠标的每一项输入?

基本上我在创建一个应用程序,它会在空闲时启动类似屏幕保护程序的东西,为此,我需要知道在我的窗口(应用程序)内发生键盘或鼠标事件的时间。

我尝试将key-press-event连接到我的窗口,但当我像按钮一样单击其子窗口时,该窗口没有获得该事件。

感谢您的任何解决方案。

更新 如公认的答案所示,我将event-after信号连接到主窗口,并确定是否需要接收该信号。

推荐答案

可能首先回想起有信号和事件。也许有些过于简单化了,事件是"原始的":例如,它们来自键盘或鼠标。最上面的小部件(认为窗口在底部)接收这些事件,并决定它是否对事件感兴趣。

如果小部件对事件感兴趣,比如按钮对按钮按下事件和按钮释放事件感兴趣,那么小部件就会创建信号,例如在本例中是"已单击"、"已双击"信号。在事件处理程序内部,返回值(True或False)确定事件是否向下传播到下一个小部件(在最上面的小部件下)。

因此,我怀疑您不能轻松地在底层窗口上直接监视所有事件,直到它们到达其目标。

对于您来说,解决方案可能是连接到窗口的"事件后"。这是独立于其他处理程序的返回值调用的。下面是一个小程序,您可以在其中测试以下内容:

GtkGrid显示一个标签、一个按钮和一个旋转按钮。右下角单元格为空:

  • 单击标签,事件会向下渗透到窗口,因为标签不会捕获任何事件

    /li>
  • 单击该按钮,处理程序将捕获事件(如"已按下"),并生成"已点击"等信号。

  • 我已连接到"Event-After",但报告按下了任意位置的按钮。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
#  test_events.py
#
#  Copyright 2017 John Coppens <john*at*jcoppens*dot*com>
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
#
#


from gi.repository import Gtk

class EventsTest(Gtk.Grid):
    def __init__(self):
        super(EventsTest, self).__init__()

        btn = Gtk.Button("Top right")
        btn.connect("clicked", lambda x: print("Button clicked"))

        self.attach(Gtk.Label("Top left"), 0, 0, 1, 1)
        self.attach(btn, 1, 0, 1, 1)
        self.attach(Gtk.SpinButton(), 0, 1, 1, 1)


class MainWindow(Gtk.Window):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.connect("destroy", lambda x: Gtk.main_quit())
        self.connect("button-press-event", self.on_button_pressed)
        self.connect("event-after", self.on_event_after)

        evtest = EventsTest()

        self.add(evtest)
        self.show_all()

    def on_button_pressed(self, btn, event):
        print("Main window button pressed")
        return True

    def on_event_after(self, wdg, event):
        print("Event after")

    def run(self):
        Gtk.main()


def main(args):
    mainwdw = MainWindow()
    mainwdw.run()

    return 0

if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

这篇关于Python gtk3窗口监听输入事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆