Pyside Tastendruck simulieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Hi,
ich möchte einfach nur einen Tastendruck mit Pyside simulieren und bekomme es einfach nicht hin ;)

Code: Alles auswählen

from PySide.QtCore import *
from PySide.QtGui import *
import time

def sendkeys():
    QKeyEvent(QEvent.KeyPress, Qt.Key_Q, Qt.NoModifier)
    QKeyEvent(QEvent.KeyRelease, Qt.Key_Q, Qt.NoModifier)

while 1:
    sendkeys()
    time.sleep(1)
Ohne GUI ware mir lieber.

mfg D
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was soll denn da passieren? Willst du ANDEREN Anwendungen Tastendrücke senden? Das geht nicht mit Qt. Benutz autohotkey.

Nachtrag: unter Windows.
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Hi,

Also das eigentliche Problem ist:

Und zwar hatte ich mal einen Treiber für den XBox360 Controller geschrieben. (Mit python-uinput)
Jetzt möchte ich eine GUI benutzen um die Tasten konfigurieren zu können.
Dazu habe ich Antimicro installiert.

Leider erkennt dies nicht die Tastendrücke.

D.h.:
Ich muss die Tastendrücke irgendwie nach QT / bzw. SDL konvertieren.. bzw. das Script komplett ändern..


Ein Beispiel mit Python-uinput:

Code: Alles auswählen

            if u > -20000 and u < 0:
                device.emit(uinput.KEY_Q, 0, syn=True)
            if u < -30000:
                device.emit(uinput.KEY_Q, 1, syn=True)
Edit: Ist Linux
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich hab immer noch nicht begriffen was du erreichen willst. Wer soll die Tastendrücke bekommen? Deine Programme? Oder beliebige andere Programme? In letzterem Fall: dann kannst du nichts anfangen mit QEvent & Co - das ist pur intern zu einer Qt Anwendung.
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Ich habe den Beitrag nochmal überarbeitet, ich hoffe jetzt ist es verständlich :)
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Leider nein. Kannst du mal meine Frage beantworten? Dann sehe ich klarer.
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Ja, die Tastendrücke sollen möglichst von allen Programmen empfangen werden (was im Prinzip auch funktioniert).

Antimicro ist ein Keymapper den ich benutzen wollte um die Tasten zu überschreiben. Leider erkennt dieses Programm mein Python-Uinput Script überhaupt nicht.

Ich bin leider auch nicht sicher, welche Tastencodes von Antimicro unterstützt werden.

Habe etwas von xtest, QT und sdl gelesen..

Wäre natürlich gut, wenn ich mein Programm nicht komplett umschreiben, oder ne eigene GUi entwickeln müsste..
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wozu brauchst du denn dein Skript überhaupt? Antimicro macht doch genau was du willst? Wozu braucht es da dein Skript?
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Ja, gut, ich habe hier so einen alten Controller, der wird wird von Antimicro erkannt,
der XBox Controller aber nicht,
wahrscheinlich weil er Xinput nutzt,
was von Linux nicht unterstützt wird.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du deinen Controller mit uinput nutzen kannst, wieso sollte antimcro das nicht können? Hast du die mal gefragt? Ich kann mir nicht vorstellen, das die nicht die gleichen Mechanismen nutzen die du auch nutzt.

So oder so verstehe ich dein Problem nicht. Wenn du ein Python Skript hast, welches den Controller erkennt, und globale Tastenereignisse erzeugt - wieso kannst du dann nicht einfach eine Konfigdatei anlegen, mit der das Skript gesteuert wird. Wenn die sich ändert (kannst du periodisch prüfen), konfiguriert es sich neu. Wie du diese Datei dann wiederum erstellst, ist dann ja Wurscht. Kannst du dir eine schöne GUI für schreiben, oder einen Texteditor bemühen.
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Klar, habe ich ne Text Config oder könnte eine GUI schreiben,
Eine textconf ist halt unschön und fehleranfällig, und eine GUI wäre doppelte Arbeit..

Habe gerade ein Blick in den source des xboxdrv geworfen, steht was von dbus...
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn eine GUI zu viel Arbeit und eine Textkonfiguration zu fehleranfällig ist, was ist denn dann bitte die Alternative?

Der xboxdrv sieht prinzipiell ja gut aus. Und benutzt eine Konfigurationsdatei....

Stattdessen dbus zu verwenden soll denn genau wie helfen? Die API zu bedienen ist garantiert nicht weniger Komolex als eine GUI zur Erstellung einer Konfigurationsdatei zu schreiben. Und wenn du das trotzdem tust, hast du danach ein System bei dem du vor jeder Nutzung mühselig wieder den gewünschten Stand hinklicken musst. Da will man also eigentlich sofort genau diesen stand speichern, und dan hat man wieder.... eine Konfigurationsdatei :K
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Naja, ich denke der Author von Antimicro hat das auch nicht an einem Wochenende geschrieben, und warum was neu schreiben, das es schon gibt?

Wäre auch interessant, warum es nicht erkannt wird...
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich glaube wir reden hier massiv aneinander vorbei. Ich schlage nicht vor etwas neues schreiben. Der xboxdrv macht doch was du willst. Du bist doch derjenige der etwas Neues schreibt :K
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Ja, irgendwie.....
Also den XBox Treiber habe ich neu geschrieben, weil
der xboxdrv NICHT mit dem Wireless Chatpad funktioniert.

Dafür funktioniert der xboxdrv mit Antimicro,
und meiner nicht.

Nun, man könnte ja auch je nach Bedarf den einen oder anderen Treiber benutzen,
aber ist eben auch nicht die beste Lösung..
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Also ich weiss jetzt wie es geht..

In dieser Definition ist ein "Fehler":

Code: Alles auswählen

code=(
    uinput.KEY_LEFTSHIFT,
    uinput.KEY_LEFTCTRL,
    uinput.KEY_LEFTMETA,
    uinput.KEY_RIGHTALT,
    uinput.KEY_ESC,
    uinput.KEY_1,

123.. a-z..

    uinput.REL_X,
    uinput.REL_Y,
    uinput.ABS_X,
    uinput.ABS_Y,
    uinput.ABS_RX,
    uinput.ABS_RY,
)
Wer den Fehler nicht gleich sieht:

Es muss natürlich:

Code: Alles auswählen

code=(
    uinput.KEY_LEFTSHIFT,
    uinput.KEY_LEFTCTRL,
    uinput.KEY_LEFTMETA,
    uinput.KEY_RIGHTALT,
    uinput.KEY_ESC,
    uinput.KEY_1,

123.. a-z..

    uinput.REL_X,
    uinput.REL_Y,
    #uinput.ABS_X, # made problems..
    #uinput.ABS_Y, # made problems..
    uinput.ABS_RX,
    uinput.ABS_RY,
)
heissen!!

Das muss jetzt keiner verstehen, ich verstehe es auch nicht,
nur Antimicro kommt damit scheinbar nicht klar.... :K

Die 2 Sachen auskommentiert und ANTIMICRO erkennt die Tasten!
Antworten