Kursortasten

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
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

Wie kann ich festellen, welche der Tasten "hoch, rechts, links, unten" (ich kann sie ja nicht hinschreiben) gerückt wurde?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Unter welchem System, und unter welcher Umgebung (Kommandozeile, GUI, wenn ja, welche)?
sauterle
User
Beiträge: 84
Registriert: Mittwoch 27. Juli 2022, 21:33

ich glaube das geht mit der keyboard bibliotek
keyboard.is_pressed("up"):
keyboard.is_pressed("down"):
keyboard.is_pressed("left"):
keyboard.is_pressed("right"):

gibt glaube ich jeweils einen bool wert
LG sauterle
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

Code: Alles auswählen

import keyboard

i = keyboard.is_pressed("up")
j = keyboard.is_pressed("down")
k = keyboard.is_pressed("left")
l = keyboard.is_pressed("right")

print(i,j,k,l)
Ich nutze IDLE unter Windows 11. Die Ausgabe lautet: False, False, False, False,
Benutzeravatar
__blackjack__
User
Beiträge: 13937
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Dann war wohl keine der Tasten gedrückt als das Programm lief.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

So schnell war ich nicht, ich habe das probiert, da geschah nichts.

Code: Alles auswählen

f keyboard.is_pressed("up"):
	print('i')
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

So eine Abfrage ist nur sinnvoll, wenn sie in einer dauerhaften Schleife erfolgt.
Sirius3
User
Beiträge: 18227
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt ein Programm schreiben, das in einer Schleife prüft, ob eine Taste gedrückt worden ist.
Was für ein Programm möchtest Du eigentlich schreiben?
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

Ich habe ein python-Sudoku aus dem Netz bearbeitet, es zeigt das Spielfeld grafisch. Nun möchte ich mich mit den Kursotasten dort bewegen und ein Feld markieren, um etwas einzugeben.
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

Code: Alles auswählen

import keyboard

def key():
    w = True
    while w:
        if keyboard.is_pressed("up"):
            w = False
            return 'u'
        if keyboard.is_pressed("down"):
            w = False
            return 'd'
        if keyboard.is_pressed("left"):
            w = False
            return 'l'
        if keyboard.is_pressed("right"):
            w = False
            return 'r'

c = key()
print(c)
Danke, es klappt.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das w ist quatsch, das return beendet die Funktion ohne das die Flagge nochmal ausgewertet wird.
Sirius3
User
Beiträge: 18227
Registriert: Sonntag 21. Oktober 2012, 17:20

@hubgra: das keyboard-Modul ist falsch. Das murkst in den Innereien des Betriebssystems rum.
Welches GUI-Rahmenwerk benutzt Dein Sudoku? Das bietet dann auch Methoden, um auf Tastendrücke zu reagieren.
Benutzeravatar
__blackjack__
User
Beiträge: 13937
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@hubgra: Die Funktion ist unnötig umständlich, mal abgesehen von dem unnötigen `w` und das man nicht am verwendeten GUI-Rahmenwerk vorbei programmiert.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import keyboard


def read_direction():
    for key in iter(keyboard.read_key, object()):
        if key in {"up", "down", "left", "right"}:
            return key[0]


def main():
    print(read_direction())


if __name__ == "__main__":
    main()
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

@__blackjack__
Was sollen die letzten 4 Zeilen? main() ruft eine Funktion auf, die ggf. wirklich aufgerufen wird.
Warum nicht direkt read_direction()?
Das habe ich gemacht (zuvor die letzten Zeilen auskommentiert), und es passierte: NICHTS
Benutzeravatar
__blackjack__
User
Beiträge: 13937
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@hubgra: Das Grundgerüst sieht immer so aus:

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    ...


if __name__ == "__main__":
    main()
Statt `main()` direkt `read_direction()` aufrufen hat keine Ausgabe, weil dann ja das `print()` fehlt. Das könnte man auch in den ``if``-Zweig stecken, aber dann lässt sich das nicht mehr von anderen Modulen aus aufrufen.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

Code: Alles auswählen

def read_direction():
    for key in iter(keyboard.read_key, object()):
        if key in {"up", "down", "left", "right"}:
            print(type(key),key[0])
            return(key[0])

print(read_direction())
Ich habe das mal ergänzt, es passiert immer noch nichts. Welchen Typ hat denn key und warum wird key[0] zurückgegeben?
Benutzeravatar
__blackjack__
User
Beiträge: 13937
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@hubgra: Na Du siehst doch den Test. `key` hat offensichtlich den Typ `str` damit das funktioniert. Und ``key[0]`` damit das gleiche zurückgegeben wird wie bei Deinem Code. Darum ging es doch: Code zu haben der kompakter ist und keine Wiederholungen enthält und das gleiche macht.

Ich habe das gerade mal getestet und bei mir funktioniert es.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Antworten