PiZero soll Tastenkombinationen an Windows PC weitergeben

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
drcox0815
User
Beiträge: 4
Registriert: Donnerstag 7. Februar 2019, 13:59

Donnerstag 7. Februar 2019, 14:30

Hi!

Ich habe jetzt einige Zeit versucht Tastenkombinationen, die ich auf meinen PiZeroW eingebe an meinen PC weiterzugeben. Raspbian habe ich soweit konfiguriert, dass der Pi als USB Tastatur von Windows erkannt wird.
Mit Python möchte ich nun gerne ein GUI (tkinter) schreiben, das dann Buttons hat, die Tastenkombinationen wie zum Beispiel ALT+F1 an den PC weitergeben.
Ziel ist es diese Buttons dann per Touchscreen zu drücken und dann am PC einen Shortcut zu benutzen.

Zum Beispiel ALT+F4 um ein Programm zu schließen. Das ist nur zum veranschaulichen. Theoretisch möchte ich damit in verschiedenen Programmen verschiedene Optionen durchführen.
Ich kann mir zum Beispiel vorstellen, dass man in Teamspeak Tastenkombinationen zum muten und unmuten einrichtet, diese dann im Pythonprogramm anpasst und die Buttons entsprechend mit Bildern oder Text versieht um die Funktion zu sehen.

Wie ich das GUI und Buttons erstelle weiss ich mittlerweile. Leider habe ich keine Ahnung, wie ich dem Button sagen kann, welche Funktion er hat. Ich habe in den Weiten des Internetz schon ein virtual Keyboard code gefunden der aber leider zu simpel gestrickt ist. Die buttons werden ja nur über die Kommagetrennten Buchstaben generiert.

Das wäre der hier:

Code: Alles auswählen

from tkinter import *
import tkinter

Keyboard_App = tkinter.Tk()
Keyboard_App.title("On Screen Keyboard")
Keyboard_App.resizable(False, False)


def select(value):
    if value == "<-":
        entry2 = entry.get()
        pos = entry2.find("")
        pos2 = entry2[pos:]
        entry.delete(pos2, tkinter.END)
    elif value == " Space ":
        entry.insert(tkinter.END, ' ')

    elif value == " Tab ":
        entry.insert(tkinter.END, '     ')
    else:
        entry.insert(tkinter.END, value)


buttons = [
    'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', 'o', 'p',
    'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l',
    'y', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.',
    ' Space ',
]
label1 = Label(Keyboard_App, text='             ').grid(row=0, columnspan=1)
entry = Entry(Keyboard_App, width=128)
entry.grid(row=1, columnspan=15)

varRow = 2
varColumn = 0

for button in buttons:
    command = lambda x=button: select(x)
    if button != " Space ":
        tkinter.Button(Keyboard_App, text=button, width=5, bg="#000000", fg="#ffffff",
                       activebackground="#ffffff", activeforeground="#000000", relief='raised', padx=4,
                       pady=4, bd=4, command=command).grid(row=varRow, column=varColumn)
    if button == " Space ":
        tkinter.Button(Keyboard_App, text=button, width=60, bg="#000000", fg="#ffffff",
                       activebackground="#ffffff", activeforeground="#000000", relief='raised',
                       padx=4, pady=4, bd=4, command=command).grid(row=6, column=16)
    varColumn += 1
    if varColumn > 14 and varRow == 2:
        varColumn = 0
        varRow += 1
    if varColumn > 14 and varRow == 2:
        varColumn = 0
        varRow += 1

Keyboard_App.mainloop()
Ich möchte noch dazu sagen, dass ich blutiger Anfänger bin was Python angeht.

Danke schon mal im Voraus!

Grüße DrCox0815
__deets__
User
Beiträge: 5328
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 7. Februar 2019, 15:33

Du hast ja schon command - das reicht nur leider nicht, weil es keinen Unterscheidung zwischen druecken und loslassen macht. Wenn du also ein Bildschirmkeyboard haben willst, musst du dich mit Event-Bindings beschaeftigen:

http://effbot.org/tkinterbook/tkinter-e ... ndings.htm

Da kannst du explizit Ereignisse fuer den Druck und das loslassen eines GUI-Elementes bekommen.
drcox0815
User
Beiträge: 4
Registriert: Donnerstag 7. Februar 2019, 13:59

Donnerstag 7. Februar 2019, 17:39

Hi deets,

danke für die schnelle Rückmeldung! Ich habe jetzt versucht anhand des Beispiels aus deinem Link eine Tastenkombi via Button weiterzugeben.
Leider gibt mir der Button nichts aus.

Code: Alles auswählen

from tkinter import *
import tkinter as tk

root = Tk()


def key(event):
    print('pressed', repr(event.keysym))


def callback(event):
    frame.focus_set()
    print('clicked at', event.x, event.y)


frame = Frame(root, width=100, height=100)
frame.bind("<Key>", key)
frame.bind("<Button-1>", callback)
B = tk.Button(text="Test", )
B.bind("<Alt_L>" + "<F4>", key)
B.config(fg="white", bg="black")
B.pack(side="top")
frame.pack()


root.mainloop()
__deets__
User
Beiträge: 5328
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 7. Februar 2019, 18:55

Du musst schon den Fokus auf dem Button haben. Sonst bekommt der keine key-Events. Ausserdem hast du ein gedanklichen Knoten drin: Es bringt dir ueberhaupt nichts, dich an Alt-F4 zu binden. Da kannst du auch gleich einfach die Tastatur des PI in den PC stecken, und schon hast du Alt-F4. Was soll das also bringen?

Stattdessen kannst du eben bei pressed mit der Maus auf dem Button "a" ueber den USB-Tastatur-Mechanismus des PI (wie genau das jetzt geht musst du ja wissen, wenn es schon klappt) eben ein 'pressed a' Event an den PC schicken. Beim loslassen umgekehrt. Da tkinter nicht multi-touch-faehig ist,wirst du dir fuer die modifier etwas einfallen lassen muessen. Also zB sticky keys programmieren.
drcox0815
User
Beiträge: 4
Registriert: Donnerstag 7. Februar 2019, 13:59

Donnerstag 7. Februar 2019, 20:12

Noch mal danke für deine Antwort. Das Alt+F4 ist nach wie vor ein Beispiel. Ich habe tatsächlich noch nicht versucht einen tkinter button per touchscreen zu drücken.

Eventuell kann ich es besser erklären, wenn du dir ein Elgato Steaming Deck vorstellst. So in der Art versuche ich das nachzubauen. Ich muss dann halt den verschiedenen Funktionen von OBS Tastenkombis zuweisen die ich dann mit den tkinter Buttons aktivieren möchte.
Gruß

DrCox
__deets__
User
Beiträge: 5328
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 7. Februar 2019, 21:24

Ich kenne dieses Ding zwar nicht - aber ich glaube ich weiß was du falsch machst. Tkinter kann GUIs. Es kann auf Eingaben reagieren. Was es NICHT kann, ist HID -device Ereignisse generieren. Das geht anders - wahrscheinlich beschrieben in der Anleitung mit der du deinen zero konfiguriert hast. Das musst du rausfinden wie das geht & dann auf Knopfdruck machen.
__deets__
User
Beiträge: 5328
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 7. Februar 2019, 22:43

drcox0815
User
Beiträge: 4
Registriert: Donnerstag 7. Februar 2019, 13:59

Donnerstag 7. Februar 2019, 23:10

Ja damit habe ich den Raspberry so weit, dass er als USB Gerät (Tastatur) erkannt wird. Jetzt wollte ich halt noch über ein GUI via Touchscreen Tasten an den PC weitergeben.
Ich versuche mich da mal weiter reinzuelsen aber ich glaube auch, dass ich grad etwas zu sehr in die eine Richtung denke. Liegt aber auch an dem fehlenden Wissen.
Antworten