Tkinter GUI Raspberry Zero Hid Keyboard

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Mavemaverick
User
Beiträge: 2
Registriert: Dienstag 20. Januar 2026, 07:21

Hallo zusammen,

ich bin ein absoluter Neuling was Pythen bzw. Tkinter angeht.
Ich möchte den Raspberry Zero als Hid Tastatur an die PS5 anschliessen und dann über ein mit Tkinter erstellte GUI über Button Befehle auf der PS5 ausführen.
So weit so gut.
Ich habe den Raspberry mit dieser Beschreibung in eine Hid Tastatur umgewndelt.
https://devattendant.de/blog/tech/raspb ... -remotely/

Der Raspberry wird von der PS5 als Tastatur erkannt;-)))
Jetzt fehlt mir leider noch das Python Script um die Gui zu Leben zu erwecken.

Ich habe es zu Test so probiert: Leider wird das "a" gleich nach Start des Python Programms ausgegeben und nicht nach drücken des Buttons
Kann mir bitte hier jemand helfen? Danke schon mal ;-)

import tkinter as tk
import time

# Paths to HID devices
keyboard_path = "/dev/hidg0"

def send_keyboard_event(modifier, keycode):
report = bytearray(8)
report[0] = modifier
report[2] = keycode
with open(keyboard_path, "rb+") as keyboard:
keyboard.write(report)
time.sleep(0.1)
# Release keys
keyboard.write(bytearray(8))

# Hauptfenster erstellen
root = tk.Tk()
root.title("Msfs2024 GUI")
root.geometry("800x600")

# Rahmen Flaps erstellen
flaps_frame = tk.Frame(root, bg="lightblue", bd=2, relief="raised")
flaps_frame.place(x=1, y=1, width=210, height=470)

# Schriftfeld erstellen
flaps_label = tk.Label(flaps_frame, text="FLAPS",bg="lightblue", fg="black")
flaps_label.place(x=70, y=1, width=75, height=15)

# Button erstellen
button_kb1 = tk.Button(flaps_frame, text="Null",width=5,height=3, bg="grey", fg="black",font=('Arial', 10),command=send_keyboard_event(0x00, 0x04))
button_kb1.place(x=1, y=20)


root.mainloop()

Gruß Ralf
Sirius3
User
Beiträge: 18350
Registriert: Sonntag 21. Oktober 2012, 17:20

Beim Programmieren gibt es einige Regeln, die man beachten sollte.
Benutze kein `place` sondern positioniere Deine Elemente mit `grid` oder `pack`, damit man unabhängig vom Betriebssystem und der Bildschirmauflösung ist.
Ebenso gibt man keine fixe Fenstergröße vor, sondern der Inhalt bestimmt die Größe.
Farben und Schrift läßt man am besten so, wie es der User für sich eingestellt hat, weil der hat unter Umständen gute Gründe dafür.

In Deinem Butten gibst Du den Rückgabewert des Aufrufst von `send_keyboard_event` als `command` an, was hier None ist.
Statt dessen möchtest Du ein aufrufbares Objekt übergeben, was man in Deinem Fall mit `functools.partial` macht.

Code: Alles auswählen

from functools import partial
import tkinter as tk
import time

# Paths to HID devices
KEYBOARD_PATH = "/dev/hidg0"


def send_keyboard_event(modifier, keycode):
    report = bytes([modifier, 0, keycode, 0, 0, 0, 0, 0])
    release = b"\0" * 8
    with open(KEYBOARD_PATH, "wb") as keyboard:
        keyboard.write(report)
        time.sleep(0.1)
        keyboard.write(release)


def main():
    root = tk.Tk()
    root.title("Msfs2024 GUI")

    flaps_frame = tk.Frame(root, bd=2, relief="raised")
    flaps_frame.pack()
    tk.Label(flaps_frame, text="FLAPS").pack()
    tk.Button(
        flaps_frame, text="Null", command=partial(send_keyboard_event, 0x00, 0x04)
    ).pack()

    root.mainloop()


if __name__ == "__main__":
    main()
Mavemaverick
User
Beiträge: 2
Registriert: Dienstag 20. Januar 2026, 07:21

Danke für die schnelle Antwort! Ich nehme mir die Sachen zu Herzen und werde das heute Abend noch ausprobieren.
Benutzeravatar
__blackjack__
User
Beiträge: 14276
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ergänzende Anmerkungen:

Der Dateimodus "rb+" für eine Datei in die nur geschrieben wird, ist komisch bis falsch. Das wäre "wb".

Wenn es im `tkinter`-Modul für eine Zeichenkette mit einer festen Bedeutung eine Konstante gibt, dann sollte man die verwenden. Also beispielsweise `tk.RAISED` statt "raised". Wenn man sich vertippt, fällt das früher auf, und der Leser weiss dann auch, dass das kein beliebiger Text, sondern eine definierte Konstante ist.

Kommentare sollten dem Leser einen Mehrwert über den Code geben. Faustregel: Ein Kommentar beschreibt nicht was der Code macht, denn das steht da ja bereits als Code, sondern warum er das so macht. Sofern das nicht offensichtlich ist. Offensichtlich ist in der Regel auch was in der Dokumentation der Programmiersprache und den verwendeten Bibliotheken steht. Der Kommentar ``# Button erstellen`` wo im Code dann sehr offensichtlich ein Button erstellt wird, ist beispielsweise überflüssig.

Namen sollten keine kryptischen Abkürzungen enthalten, oder gar nur daraus bestehen, und auch nicht nummeriert werden. Wenn man Namen durchnummeriert, will man in der Regel gar keine Einzelnamen und -werte, sondern eine Datenstruktur. Oft eine Liste. Im Falle des `Button`-Objekts aber eventuell auch gar keinen Namen, denn wenn man auf das Objekt später nicht noch zugreifen muss, braucht das auch nicht zwingend einen Namen.

Es wäre vielleicht sinnvoll die Argumente von `send_keyboard_event()` zu tauschen und beim `modifier` einen Defaultwert von 0 anzugeben. Und für die magische 4 und die 0en die für „NoEvent“ stehen, jeweils eine Konstante zu definieren.

Code: Alles auswählen

#!/usr/bin/env python3
import time
import tkinter as tk
from functools import partial

KEYBOARD_DEVICE_PATH = "/dev/hidg0"
KEYCODE_NONE = 0
KEYCODE_A = 4


def send_key(keycode, modifier=0):
    with open(KEYBOARD_DEVICE_PATH, "wb") as file:
        file.write(
            bytes(
                [
                    modifier,
                    0,
                    keycode,
                    KEYCODE_NONE,
                    KEYCODE_NONE,
                    KEYCODE_NONE,
                    KEYCODE_NONE,
                    KEYCODE_NONE,
                ]
            )
        )
        time.sleep(0.1)
        file.write(
            bytes(
                [
                    0,
                    0,
                    KEYCODE_NONE,
                    KEYCODE_NONE,
                    KEYCODE_NONE,
                    KEYCODE_NONE,
                    KEYCODE_NONE,
                    KEYCODE_NONE,
                ]
            )
        )


def main():
    root = tk.Tk()
    root.title("Msfs2024 GUI")

    flaps_frame = tk.Frame(root, border=2, relief=tk.RAISED)
    flaps_frame.pack()

    tk.Label(flaps_frame, text="FLAPS").pack(side=tk.TOP)

    tk.Button(
        flaps_frame, text="Null", command=partial(send_key, KEYCODE_A)
    ).pack(side=tk.TOP)

    root.mainloop()


if __name__ == "__main__":
    main()
“Programming is partially an artform and, like artists, programmers will do it even if they don't get money.” — Linus Torvalds
Antworten