Seite 1 von 1

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

Verfasst: Mittwoch 6. Dezember 2023, 16:38
von turtelix
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?

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

Verfasst: Freitag 29. Dezember 2023, 16:22
von __blackjack__
@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.