2010-12-27 14 views
3

Wie der Titel sagt, versuche ich, Maus und Tastatur Ereignisse mit Python-GTK zu erfassen.Tastatur/Maus Ereignisse auf dem Desktop/Root-Fenster mit pygtk (gtk.gdk) unter Linux

Ich kann dies mit mit Python-xlib leicht zu tun:

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) 

ich die analoge mit gtk.gdk sehen * Funktionen, aber ich kann einfach nicht scheinen Ereignisse auf dem Haupt Desktop-Fenster zu erfassen.. Kann das gemacht werden?

Dies ist, wie ich die Aufgabe zu erfüllen versuchte ... (ALL_EVENTS_MASK war ein Akt der Verzweiflung;])

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 

Antwort

3

Hier ist ein Beispiel, das ich tat nur, dass man auf sie stützen können:

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() 

Starten Sie nun das Skript und klicken auf irgendeinen Suchbegriff Schlüssel et voilà (Output):

$ python gtk_script.py 
click 
click 
click 
click 

Hoffe, das kann helfen

+0

Dies ist eine Light-Version des Beispielcodes, den ich bereits hinzugefügt habe. Dies ist auch ein GTK-Fenster. Ich brauche ein gtk.gdk-Fenster ... in diesem Fall den GESAMTEN Desktop, kein einfaches Anwendungsfenster. Mein Problem wäre sonst trivial. – digitalfoo

+0

@lsthree: wo rufst du an, set_events() ??? Es sollte direkt nach dem Erstellen des Widgets in Ihrem Fall gtk.gdk.Window aufgerufen werden !!! – mouad

+0

ah! oops, als ich vorher einen Blick geworfen habe, dachte ich, unsere Namen für die Event-Methode wären gleich. Ich habe den Zusatz gemacht, aber das Problem bleibt bestehen. Beispielsweise können Sie key_press, button_press usw. nicht mit dem Stammverzeichnis des Desktops verbinden. 'self.root_window.set_events (gtk.gdk.ALL_EVENTS_MASK)' gibt mir Ereignisse, wenn ich ein anderes Fenster fokussiere oder wenn ich ein Fenster minimiere/maximiere. Ich muss Tastatur- und Mausereignisse bekommen. – digitalfoo

0

Ich vermute, das kann nicht mit einfachen Gtk getan werden, und Sie müssen Xlib oder andere Form der Kommunikation mit dem Server selbst beinhalten. Es sei denn, Ihre App läuft im Hauptfenster selbst.

Ich kann natürlich falsch liegen.