Python Xlib ловит / отправляет щелчок мышью - PullRequest
1 голос
/ 18 июля 2009

В данный момент я пытаюсь использовать Python, чтобы определить, когда удерживается левая кнопка мыши, а затем начать быстро отправлять это событие вместо одного раза. Что я в основном хочу сделать, так это то, что когда левая кнопка мыши удерживается, она щелкает и щелкает снова, пока вы не отпустите ее. Но я немного озадачен всем Xlib, я думаю, что это на самом деле очень запутанно. Любая помощь в том, как это сделать, была бы действительно потрясающей. Вот что у меня так далеко:

#!/usr/bin/env python

import Xlib
import Xlib.display

def main():
    display = Xlib.display.Display()
    root = display.screen().root
    while True:
        event = root.display.next_event()
        print event

if __name__ == "__main__":
    main()

Но, к сожалению, в консоли нет вывода. После быстрого поиска в интернете я обнаружил следующее:

root.change_attributes(event_mask=Xlib.X.KeyPressMask)
root.grab_key(keycode, Xlib.X.AnyModifier, 1, Xlib.X.GrabModeAsync,
              Xlib.X.GrabModeAsync)

Это похоже на импорт, чтобы поймать специальное событие с данным кодом. Но, во-первых, какой код ключа имеет щелчок левой кнопкой мыши, если он вообще есть? И во-вторых, как я могу определить, когда оно удерживается, а затем быстро начать отправку события щелчка мышью. Буду очень благодарен за помощь. (Может быть, способ остановить этот скрипт с помощью горячей клавиши был бы клевым ...)

1 Ответ

5 голосов
/ 18 июля 2009

На самом деле вы хотите Xlib.X.ButtonPressMask | Xlib.X.ButtonReleaseMask, чтобы получать события для нажатий и отпусканий кнопок (отличается от нажатия и отпускания клавиш). Это ButtonPress и ButtonRelease, а переменная экземпляра detail дает вам номер кнопки. С момента, когда вы получаете событие прессы, до того, как вы получаете событие релиза, вы знаете, что кнопка удерживается. Конечно, вы можете также получать события клавиш и делать что-то еще (например, выходить из сценария) при нажатии определенной клавиши.

Редактировать : эта версия отлично работает для меня, например ...:

import Xlib
import Xlib.display

def main():
    display = Xlib.display.Display(':0')
    root = display.screen().root
    root.change_attributes(event_mask=
        Xlib.X.ButtonPressMask | Xlib.X.ButtonReleaseMask)

    while True:
        event = root.display.next_event()
        print event

if __name__ == "__main__":
    main()
...