【问题标题】:Keyboard/Mouse events on desktop / root window with pygtk (gtk.gdk) on LinuxLinux 上使用 pygtk (gtk.gdk) 的桌面/根窗口上的键盘/鼠标事件
【发布时间】:2011-03-04 20:21:00
【问题描述】:

正如标题所述,我正在尝试使用 Python-gtk 捕获鼠标和键盘事件。

我可以使用 python-xlib 轻松做到这一点:

    self.display = display.Display()
    self.screen = self.display.screen()
    self.root_window = self.screen.root

    self.root_window.grab_pointer(1,
             X.ButtonPressMask | X.ButtonReleaseMask | X.Button1MotionMask,
             X.GrabModeAsync,
             X.GrabModeAsync,
             X.NONE, X.NONE,
             X.CurrentTime)

    self.root_window.grab_keyboard(1,
              X.GrabModeAsync,
              X.GrabModeAsync,
              X.CurrentTime)

我看到了使用 gtk.gdk.* 函数的模拟,但我似乎无法在主桌面窗口上捕获事件。这个可以吗?

这就是我试图完成任务的方式...(ALL_EVENTS_MASK 是一种绝望的行为;])

    self.root_window = gtk.gdk.get_default_root_window()
    self.root_window.set_events(gtk.gdk.ALL_EVENTS_MASK)
    gtk.gdk.event_handler_set(self.filter_callback)
    gtk.main()

    def filter_callback (self, *args):
        print args

【问题讨论】:

    标签: python linux gtk pygtk gdk


    【解决方案1】:

    这是我刚刚做的一个例子,你可以以此为基础:

    import gtk
    
    
    def on_key_press(widget, data=None):
        print "click"
    
    if __name__ == '__main__':
        w = gtk.Window()
    
        # Connect the callback on_key_press to the signal key_press.
        w.connect("key_press_event", on_key_press)
        # Make the widget aware of the signal to catch.
        w.set_events(gtk.gdk.KEY_PRESS_MASK)
    
        w.show_all()
    
        gtk.main()
    

    现在启动脚本并单击任何关键字 key et voilà(输出):

    $ python gtk_script.py 
    click
    click
    click
    click
    

    希望对你有帮助

    【讨论】:

    • 这是我已经包含的示例代码的精简版。此外,这是一个 gtk 窗口。我需要一个 gtk.gdk 窗口……在这种情况下是整个桌面,而不是一个简单的应用程序窗口。否则,我的问题将是微不足道的。
    • @lsthree: 你在哪里打电话,set_events() ???它应该在您的案例 gtk.gdk.Window 中创建小部件后立即调用!!!
    • 啊!哎呀,当我之前浏览时,我认为我们的事件方法名称是相同的。我做了加法,但问题仍然存在。例如,您不能将 key_press、button_press 等连接到桌面的根窗口。 'self.root_window.set_events(gtk.gdk.ALL_EVENTS_MASK)' 为我提供事件,例如当我聚焦不同的窗口或最小化/最大化窗口时。我需要获取键盘和鼠标事件。
    • @lsthree:我不知道这是否有帮助,但您是否在创建 gtk.gdk.Window 时设置了 event_mask 属性? ,请参阅文档 pygtk.org/docs/pygtk/class-gdkwindow.html 类似:self.window = gtk.gdk.Window(... , event_mask=gtk.gdk.KEY_PRESS_MASK | gtk.gdk.MOTION_NOTIFY)
    • 我从不创建窗口。我只是使用包含桌面等的根/顶层窗口。我绝不会创建一个窗口并将参数传递给它。皮塔饼
    【解决方案2】:

    我猜这不能使用普通的 Gtk 来完成,您必须使用 Xlib 或其他形式的与服务器本身的通信。除非您的应用程序正在根窗口本身中运行。

    当然,我可能是错的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      相关资源
      最近更新 更多