Seite 1 von 1

Auf Taste reagieren

Verfasst: Donnerstag 12. Juni 2014, 11:26
von nfehren
Servus :)
Wie kann ich eine Variable (z.B. x = 1) Bei jedem mal wo ich die Enter taste drücke um 1 größer werden lassen?

Was ist nicht weiß ist wie die Syntax lautet um Python 3 auf eine Taste reagieren zu lassen.

Vielen Dank

Re: Auf Taste reagieren

Verfasst: Donnerstag 12. Juni 2014, 11:46
von bfm
Hallo,

außer einer Schleife mit einem "input" wüßte ich jetzt auf der Konsole nichts, womit man Tasten-Events abfangen könnte. Und da funktioniert das auch nur mit der Enter-Taste.

Eine GUI (zB Tkinter, QT usw) bieten auf jeden Fall die Möglichkeit, dass man Tasten-Events an ein Widget bindet und beim Auftreten der Events entsprechender Code ausgeführt wird.

lg

Re: Auf Taste reagieren

Verfasst: Donnerstag 12. Juni 2014, 11:56
von snafu
Unter Linux kann man ``curses`` verwenden und für Windows gibt es die ``getch()``-Funktion. Grundsätzlich ginge auch ``input()`` (in Python 3.x) oder gar ein Lauschen auf dem Eingabe-Stream. Es kommt sehr auf den Kontext an, was sich hier am Besten eignet. Sprechen wir überhaupt von Eingaben in einem Terminal?

Re: Auf Taste reagieren

Verfasst: Donnerstag 12. Juni 2014, 12:13
von nfehren
Ja es soll eine Konsolenanwendung werden :)

Re: Auf Taste reagieren

Verfasst: Donnerstag 12. Juni 2014, 20:35
von Kebap
Servus! :) Mit Enter ist es eigentlich sehr einfach.. aber ob das alles ist? :D

Code: Alles auswählen

mein_text = "Bitte Enter drücken oder eine andere Eingabe zum Abbrechen."
meine_zahl = 0

user_eingabe = input(mein_text)
while len(user_eingabe) == 0:
  meine_zahl += 1
  print("Die Zahl ist jetzt: " + str(meine_zahl))
  user_eingabe = input(mein_text)

print("So oft wurde Enter gedrückt: " + str(meine_zahl))
Leider beschreibst du gar nicht, wo und wie und warum du das genau vorhast. Mit ein wenig mehr Hintergrund könnten wir vielleicht besser beraten. Ich würde zB lieber die Nummerntasten benutzen, um Zahlen einzugeben. :mrgreen:

Re: Auf Taste reagieren

Verfasst: Freitag 13. Juni 2014, 00:08
von EyDu
@Kebap: Da gibt es einiges zu verbessern an deinem Code. Wenn du Code vom Muster

Code: Alles auswählen

anweisung x
while cond:
    ...
    anweisung x
hast, dann musst du von einer while-do-Schleife auf eine do-while-Schleife wechseln. Die Drückt man in Python üblicherweise so aus:

Code: Alles auswählen

while True:
    anweisung x
    ...
    if not cond:
        break
Damit musst du dann auch keinen Code mehr doppelt schreiben. Da du in diesem Fall noch die Anzahl der Schleifendurchläufe Zählen möchtest, bietet sich das itertools-Modul an, welches eine schöne count-Funktion bereitstellt. Dann wird aus der while-Schleife eine for-Schleife.

Die Bedingung deiner while-Schleife solltest du auch kürzer ausdrücken. ``len(x) == 0`` lässt sich schöner als ``not x`` ausdrücken.

Die ganzen Umwandlungen mittels "str" sind extrem unschön. In diesem Fall kannst du auch einfach

Code: Alles auswählen

print("Die Zahl ist jetzt:", meine_zahl)
schreiben. Da kommt das selbe Ergebnis raus. Ansonsten gilt: Ein expliziter Aufruf von "str" bei der String-Formatierung ist immer überflüssig. Such in der Python-Dokumentation mal nach "String Formatting", Strings bieten da sehr schöne Methoden. Diese solltest du auch unbedingt einsetzen. Die sind schöner, kürzer und dazu noch besser lesbar.

Dann natürlich noch der obligatorische Hinweise auf PEP 8. Konstanten werden DURCHGÄNGIG_GROSS_GESCHRIEBEN und die Einrückung sollte vier und nicht zwei Leerzeichen betragen.

Re: Auf Taste reagieren

Verfasst: Freitag 20. Juni 2014, 20:37
von Henry.St
Hallo,
ich würde mal onkey ausprobieren.
Key ist von Screen aus Turtle.

Bsp.:

Code: Alles auswählen

from turtle import Screen
screen.onkey([Variablenlose def], "[taste"])
in der def sagst du, dass x=2
am anfang ist x=1

Code: Alles auswählen

while x==1:
    #...
(Ich probiere selbst noch damit rum, wer Tipps dazu hat soll es schreiben :) )

LG
Henry

Re: Auf Taste reagieren

Verfasst: Freitag 20. Juni 2014, 20:49
von BlackJack
@Henry.St: Das erscheint mir umständlich `turtle` dazu zu verwenden wenn man eigentlich gar keine Turtle-Grafik haben will. Da kann man auch gleich ein normales GUI-Programm schreiben, was bereits in der ersten Antwort im Thema als mögliche Lösung genannt wurde.

Eine „Variablenlose def” reicht nicht, da sollte man schon eine Methode übergeben, denn irgendwie muss man ja an den Zähler kommen der erhöht werden soll. Also ohne hässliche Hacks wie globale Variablen.