Seite 1 von 1

Kursortasten

Verfasst: Donnerstag 7. September 2023, 20:14
von hubgra
Wie kann ich festellen, welche der Tasten "hoch, rechts, links, unten" (ich kann sie ja nicht hinschreiben) gerückt wurde?

Re: Kursortasten

Verfasst: Donnerstag 7. September 2023, 20:36
von __deets__
Unter welchem System, und unter welcher Umgebung (Kommandozeile, GUI, wenn ja, welche)?

Re: Kursortasten

Verfasst: Donnerstag 7. September 2023, 21:39
von sauterle
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

Re: Kursortasten

Verfasst: Freitag 8. September 2023, 09:49
von hubgra

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,

Re: Kursortasten

Verfasst: Freitag 8. September 2023, 09:55
von __blackjack__
Dann war wohl keine der Tasten gedrückt als das Programm lief.

Re: Kursortasten

Verfasst: Freitag 8. September 2023, 10:22
von hubgra
So schnell war ich nicht, ich habe das probiert, da geschah nichts.

Code: Alles auswählen

f keyboard.is_pressed("up"):
	print('i')

Re: Kursortasten

Verfasst: Freitag 8. September 2023, 10:29
von __deets__
So eine Abfrage ist nur sinnvoll, wenn sie in einer dauerhaften Schleife erfolgt.

Re: Kursortasten

Verfasst: Freitag 8. September 2023, 10:30
von Sirius3
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?

Re: Kursortasten

Verfasst: Freitag 8. September 2023, 10:39
von hubgra
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.

Re: Kursortasten

Verfasst: Freitag 8. September 2023, 10:49
von hubgra

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.

Re: Kursortasten

Verfasst: Freitag 8. September 2023, 10:51
von __deets__
Das w ist quatsch, das return beendet die Funktion ohne das die Flagge nochmal ausgewertet wird.

Re: Kursortasten

Verfasst: Freitag 8. September 2023, 11:38
von Sirius3
@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.

Re: Kursortasten

Verfasst: Freitag 8. September 2023, 12:51
von __blackjack__
@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()

Re: Kursortasten

Verfasst: Samstag 9. September 2023, 16:21
von hubgra
@__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

Re: Kursortasten

Verfasst: Samstag 9. September 2023, 16:30
von __blackjack__
@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.

Re: Kursortasten

Verfasst: Samstag 9. September 2023, 17:37
von hubgra

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?

Re: Kursortasten

Verfasst: Samstag 9. September 2023, 17:46
von __blackjack__
@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.