2017-05-25 87 views
1

有什么办法可以让python gtk3窗口捕捉来自键盘和/或鼠标的每一个输入吗?Python gtk3窗口监听输入事件

基本上我创建一个应用程序,它会推出类似屏保闲置的时候,这样做,我需要知道的时候,键盘或鼠标事件我的窗口(应用程序)内发生。

我试图key-press-event连接到我的窗口,但是当我在它的子点击,就像一个按钮,窗口没有得到该事件。

谢谢你的任何解决方案。

UPDATE 作为公认的答案表明,我连接event-after信号到主窗口,并确定如果我需要接收到的信号。

+0

我刚刚尝试了一个简单的例子(在Vala中),窗口一直在接收信号。我有一个带有一个入口和一个按钮的垂直盒子容器的窗口。信号始终发射到窗户上。必须尝试蟒蛇,但行为将是相同的。你可以发布代码(如果很小)? –

+0

对不起,但应用程序相当大,超过30个文件(类)。我确实尝试了一些代码测试,并且YES,窗口确实收到了信号。就我而言,我不知道如何解释,它有时会收到信号,有时候它不会,点击同一个按钮。 – Lee

+1

可能不是这种情况,但有时它只是一些callbackt的返回,它会阻止信号的传播。 –

回答

1

也许首先回忆一下,有信号和事件。也许有些过度简化,事件是'生'的:例如,它们来自键盘或鼠标。最顶层的窗口小部件(考虑窗口在底部)接收这些事件并决定事件是否有趣。

如果小部件对该事件感兴趣,例如对按钮按下事件和按钮释放事件感兴趣的按钮,则小部件然后创建信号,例如,在这种情况下,'点击', '双击'信号。在事件处理程序内部,返回值(True或False)确定事件是否向下传播到下一个小部件(在顶部之下)。

所以,我怀疑你不能直接监视底层窗口上的所有事件,然后才能到达目标。

也许你的解决方案将连接到该窗口的“事件后”。这会从其他处理程序的返回值中独立调用。下面是一个小程序,在那里你可以测试以下内容:

一个GtkGrid出现一个标签,一个按钮和一个数值调节钮。右下单元格为空:

  • 单击该标签上的事件涓滴的窗口,因为标签不捕获任何事件

  • 点击按钮,事件(例如作为“按下”)被处理程序捕获,并产生诸如“点击”之类的信号。

  • 我连接到'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)) 
+0

是的,这发送我需要通知'事件'或'用户活动'到主窗口的信号。谢谢。 – Lee

1

key-press-event仅适用于键盘。一个按钮会创建一个button-press-event。请参阅docs

永远记住,做动作之前,*-press-event获取运行。如果您偶然点击该按钮,我会建议您使用*-release-event,您可以在释放之前从按钮上滑下。这不是你的情况至关重要,但仍...

+0

谢谢先生,为您的建议。 – Lee