Abfrage einer einstelligen faribale ohne Bestätigung

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
Commandrer
User
Beiträge: 4
Registriert: Montag 6. Juni 2016, 15:31

Hallo an alle,

toll dass es so ein Forum gibt.
Für euch Meister ist meine Frage sicherlich einfach. Ich würde mich trotzdem über Hilfe von euch freuen.
Ich bin leider noch kompletter Anfänger, was python angeht und versuche gerade eine Art Game-Show-Buzzer zu programmieren.

Einiges habe ich schon erreichen können.
Nun bräuchte ich allerdings eure Hilfe.

Mein Ziel:

Ich möchte gerne ein Programm schreiben, welches auf die Eingabe des Benutzers wartet.
Etwas wie:

>>> g = input("Bitte Buchstabe eingeben: ")
Bitte Buchstabe eingeben:

Soweit so gut! :)
Hier jedoch möchte ich, dass das Programm:
a) nur einen Buchstaben (bzw. eine einzige Taste) als Befehl zulässt und
b) nach Eingabe dieses Buchstaben das Programm sofort weiter läuft. Also ohne die Bestätigung von Enter.

Ich hoffe ich konnte einigermasen erklären, was ich mir wünsche.
Ich bin sehr gespannt auf eure Vorschläge und Ratschläge.

Vielen Dank!
Gruß
Commandrer
BlackJack

@Commandrer: Das ist gar nicht so einfach weil das recht Plattformabhängig ist. Unter Linux/Unix könnte man das `curses`-Modul aus der Standardbibliothek verwenden. Unter Windows bräuchte man dann schon etwas externes wenn man mit dem Terminal arbeiten möchte. Zum Beispiel ein `curses`-Modul für Windows. Falls man bei der Standardbibliothek bleiben möchte und es auch eine GUI sein darf, könnte man Tkinter dafür verwenden.
Commandrer
User
Beiträge: 4
Registriert: Montag 6. Juni 2016, 15:31

hallo blackjack

vielen dank für deine schnelle antwort.
ich benutze derzeit einen raspberry pi 3 mit raspberrian...

und das mit TKinter könnte etwas für mich sein, da ich dies am Anfang meines Programmes improtiert habe.

hättest du da vieleicht ein beispielprogramm, welches ich ausprobieren kann?

soetwas wie:

"Gebe einen Buchstaben ein: "
Dein gedrückter Buchstabe lautete: " "

Vielen Dank schonmal :)
Gruß
Commandrer
BlackJack

Ungetestet:

Code: Alles auswählen

import tkinter as tk
from functools import partial


def on_keypress(label, event):
    label['text'] = event.keysym


def main():
    root = tk.Tk()
    tk.Label(root, text='Zuletzt gedrückte Taste:').pack(side=tk.TOP)
    result_label = tk.Label(root)
    result_label.pack(side=tk.TOP)
    root.bind('<KeyPress>', partial(on_keypress, result_label))
    root.mainloop()


if __name__ == '__main__':
    main()
Bei allem was ein bisschen komplexer wird braucht man bei GUI-Programmierung dann übrigens objektorientierte Programmierung mit eigenen Klassen.
Commandrer
User
Beiträge: 4
Registriert: Montag 6. Juni 2016, 15:31

wow das ging schnell.
Vielen Dank dafür ;)

Ich habe den Code auf meinem Pi mal ausprobiert.
Leider meckert er wegen ASCII Code und anderen Fehlern, dass er tkinker nicht importieren kann.

Eventuell ist das Problem anders zu bewältigen?
Meine zweite Idee wäre:

Der Nutzer gibt wie gewohnt seine Zahl oder seinen Buchstaben ein.
Allerdings wird nach jeder Zahl oder jedem Buchstaben eine weitere Taste automatisch ausgeführt und zwar Enter.

Damit hätte ich den gleichen Effekt.
Wäre das einfacher zu bewältigen?

Gruß
Commandrer
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Es gibt einige Linux Distributionen die das Python Paket aufteilen un Tkinter in einem separaten Paket haben. Schau mal ob es ein python-tkinter Paket gibt.
BlackJack

@Commandrer: Wer meckert wegen ASCII-Code? Quelltext und Traceback bitte. Das dürfte nur bei Python 2 passieren. Ich sehe gerade das Du zwar die Zahl 3 im Beitrag ewähnst, das sich das aber gar nicht auf die Python-Version bezieht. Wenn Du Python 2 verwendest, dann musst Du einen Kodierungskommentar angeben wenn der Quelltext Zeichen ausserhalb von ASCII enthält. Und das Modul heisst dort `Tkinter`. Also:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
import Tkinter as tk
from functools import partial


def on_keypress(label, event):
    label['text'] = event.keysym


def main():
    root = tk.Tk()
    tk.Label(root, text='Zuletzt gedrückte Taste:').pack(side=tk.TOP)
    result_label = tk.Label(root)
    result_label.pack(side=tk.TOP)
    root.bind('<KeyPress>', partial(on_keypress, result_label))
    root.mainloop()


if __name__ == '__main__':
    main()
Wie gesagt gibt's für Linux auch noch das `curses`_Modul in der Standardbibliothek. Wenn Du aber sowieso schon Tk verwendest…
Commandrer
User
Beiträge: 4
Registriert: Montag 6. Juni 2016, 15:31

@blackjack
wow das funktioniert! spitze! XD...
vielen dank für den code!

zu deinen Fragen:
Leider kriege ich die Fehlermeldung mit dem ASCII-Code nicht mehr. Ich kann mich nur noch wage daran erinnern. :K
Ich verwende wohl Python 2. Zumindest steht in den Text Editor Fenstern 2.7.9. Das könnte aber auch die Version des Editors sein.

Aber nochmal zu deinem letzen Code. Bin sehr begeistert. Genau das brauchte ich! :)
Vielen Vielen Dank nochmal!
Dürfte ich mit zukünftigen Fragen (und ich bin mir sicher die kommt schneller als gedacht :mrgreen: ) auch wieder an diesen Forum wenden?
Ich möchte dich/euch nicht überstrapazieren.

Gruß
Commandrer
Antworten