Danke für den Tipp. Mit after hat es tatsächlich geklappt. Ich hab eine Rekursion mit if-Abfrage benutzt, die quasi wie eine Schleife funktioniert. Hoffe, so hat es der Erfinder gedacht.
Aber jetzt ne ganz andere Frage: Ich habe in meinem kleinen Spiel eine Liste (laufband.laufbandliste), die am Anfang leer ist, dann mit Zufallszahlen erweitert wird, und wo gelegentlich Elemente mit pop entfernt werden. In Zeile 62 in der Funktion check_treffer prüfe ich, ob die Liste nicht leer ist (if laufband.laufbandliste:) und führe in der nächsten Zeile einen Vergleich durch. Trotzdem wirft der Interpreter den Fehler "IndexError: list index out of range", wenn man besonders schnell spielt: Pfeil nach oben/unten gedrückt halten sollte zum Nachvollziehen genügen, wenn die Tastaturverzögerung hinreichend kurz eingestellt ist.
Also, zum einen begreife ich nicht genau, wieso die Stelle mit dem Vergleich überhaupt erreicht wird, wenn die Liste leer ist. Zum anderen würde mich grundsätzlich interessieren, wie man mit sowas umgeht? Der Index-Fehler verhindert ja nicht, dass das Spiel so läuft, wie es soll. Einfach so lassen? Oder mit try behandeln? Vermutlich ist es am saubersten, wenn man Indexfehler von vorneherein gar nicht erst zulässt? Nur in diesem Fall: Wie?
Code: Alles auswählen
import tkinter as tk
import random
import time
import pickle
import os
import collections
main=tk.Tk()
main.title("Zahlenlaufband")
main.resizable(width=0, height=0)
class Walze:
walzenliste=collections.deque([1, 2, 3, 4, 5, 6, 7, 8, 9])
ll_1=tk.Label(main, text=walzenliste[3], font=("Arial 20"), width=3,
relief="groove", borderwidth=2) #LabelLinks
ll_2=tk.Label(main, text=walzenliste[4], font=("Arial 30"), width=3,
relief="groove", borderwidth=2)
ll_3=tk.Label(main, text=walzenliste[5], font=("Arial 20"), width=3,
relief="groove", borderwidth=2)
def __init__(self, row, column):
self.ll_1.grid(row=row, column=column)
self.ll_2.grid(row=row+1, column=column)
self.ll_3.grid(row=row+2, column=column)
def update_walze(self):
self.ll_1.config(text=self.walzenliste[3])
self.ll_2.config(text=self.walzenliste[4])
self.ll_3.config(text=self.walzenliste[5])
def up(self, event):
self.walzenliste.rotate(1)
check_treffer(self.walzenliste, laufband.laufbandliste)
self.update_walze()
def down(self, event):
self.walzenliste.rotate(-1)
check_treffer(self.walzenliste, laufband.laufbandliste)
self.update_walze()
class Laufband:
laufbandliste=[]
lb=tk.Label(main, width=13, text="Drücke <Enter>", font=("Arial 22"),
relief="groove", borderwidth=2)
def __init__(self, row, column):
self.lb.grid(row=row, column=column)
def ermittle_zufallszahl(self):
zufallszahl=random.randint(1, 9)
while zufallszahl==walze.walzenliste[4]:
zufallszahl=random.randint(1, 9)
return zufallszahl
def spiel(self, event=None):
self.lb.config(anchor="e")
if len(self.laufbandliste)<9:
self.laufbandliste.append(self.ermittle_zufallszahl())
self.lb.config(text=self.laufbandliste)
self.lb.after(1000, self.spiel)
else:
self.lb.config(text="GAME OVER", anchor="center")
self.laufbandliste.clear()
def set_treffer(self):
self.laufbandliste.pop(0)
self.lb.config(text=self.laufbandliste)
def check_treffer(walzenliste, laufbandliste):
if laufband.laufbandliste:
while walzenliste[4]==laufbandliste[0]:
print("TREFFER")
laufband.set_treffer()
else: print("xxxxxxx")
walze=Walze(0, 0)
laufband=Laufband(1, 1)
main.bind("<KeyPress-Up>", walze.up)
main.bind("<KeyPress-Down>", walze.down)
main.bind("<Return>", laufband.spiel)
main.mainloop()