Turtle Probleme bei Nutzung von numinput() und onkeypress()

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
turtelix
User
Beiträge: 1
Registriert: Mittwoch 6. Dezember 2023, 16:13

Ich bin Einsteiger bei Turtle - mit dem Ziel des Unterrichtseinsatzes - aber ansonsten mit Python und anderen Sprachen wohlvertraut.

Nun stolpere ich über folgendes Problem beim Programmieren eines "Pong" Spiels. Die Nutzung von onkeypress() geht wunderbar, ebenso auch die Nutzung von input mit numinput(). Was aber nicht geht ist die Nutzung von beidem gemeinsam in einem Programm. Diese Codezeilen:

Code: Alles auswählen

sc.onkeypress(play,           "space")
sc.onkeypress(showHelp,       "h")
sc.onkeypress(quit,           "q")

rawval = turtle.numinput("Set the Speed", "Speed ( 1 ... 10 ): ", default=5, minval=0, maxval=10)
ball.speed(rawval)
play()
funktionieren, und ich kann nach dem Start den Speed input eingeben und mit Enter bestätigen. Jedoch reagiert das Programm nun NICHT mehr auf die onkeypress events. Kommentiere ich die numinput() Zeile aus, läuft alles nach Plan, nur eben ohne Wahlmöglichkeit für die Speed.

Mache ich etwas falsch, oder ist das hier eine Konsequenz des tkinter Hintegrundes? Wie könnte ich sonst eine Zahl eingeben?
Benutzeravatar
__blackjack__
User
Beiträge: 13122
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@turtelix: Das wäre aber nicht garantiert, dass das ohne das `numinput()` funktioniert, denn da fehlt ein `listen()` das sicherstellt, dass das `Canvas`-Widget den Fokus hat und die Tastendrücke bekommt. Die Methode muss man immer aufrufen wenn man nicht sicher ist, dass der Fokus stimmt.

Man sollte keine kryptischen Abkürzungen verwenden. Ich rate mal das `sc` eigentlich `screen` heissen sollte. Und wenn man dieses Objekt in Fingern hat, würde ich auch alles was darauf definiert ist, auch direkt ansprechen, statt über die Funktionen aus dem `turtle`-Modul die dann letztlich ja auch wieder auf das gleiche Objekt zugreifen.

Code: Alles auswählen

#!/usr/bin/env python3
import turtle


def main():
    screen = turtle.Screen()
    screen.onkeypress(lambda: print("Space pessed"), "space")
    speed = screen.numinput(
        "Set the speed", "Speed (1 … 10)", default=5, minval=1, maxval=10
    )
    print(speed)
    screen.listen()
    screen.mainloop()


if __name__ == "__main__":
    main()
Was ist dem Code im ersten Beitrag falsch aussieht ist das `play()`. Das scheint ja nicht zum Aufrufer zurück zu kehren, dann ist das aber nicht als Rückruffunktion für Tastendrücke geeignet.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten