Ich hab ne Frage bezüglich einem Error in Python. Also ich hab mit tkinter angefangen, und dachte mir ich programmiere tik tak to mit tkinter. Alles klappt, aber wenn ich auf ein zweiten Button drücke, kommt eine Fehlermeldung: Exception in Tkinter callback: TypeError: 'NoneType' object
Komischerweise läuft das Programm trotzdem wie gewollt ab... Das Problem ist bei dieser Fehlermeldung nur, dass ich nirgends über ein None Typ Object iteriere und dort wo ich es tat, hab ich None mit "None" (also Stringtyp) ersetzt, aber trotzdem erhalte ich die Fehlermeldung, das versteh ich nicht.
Wenn ihr euch das mal anschauen würdet, wärs nett.
Hier der Code:
Code: Alles auswählen
from tkinter import *
from copy import deepcopy
class ObjectSaver(object):
def __init__(self):
self.__merkeObject=[None]
def get(self,instanz):
self.__merkeObject.append(instanz)
def replace_with(self,index):
if type(index) is not int:
raise TypeError("Index Argument must be an Integer")
wort=self.__merkeObject.pop(index)
self.__merkeObject.insert(index,None)
return wort
def printOut(self):
return self.__merkeObject
class Gewonnen(IndexError):
pass
merker=ObjectSaver()
class Hintergrund():
WinnerKreis="Kreis hat gewonnen"
WinnerKreuz="Kreuz hat gewonnen"
def __init__(self,speicher):
NoneL=[[i,k,l] for i in ["None","None"] for k in ["None","None"] for l in ["None","None"]]
NoneL.extend(["None","None","None"])
self.kreisFeld=deepcopy(NoneL)
self.kreuzFeld=deepcopy(NoneL)
self.speicher=speicher
self.kreuzDran=False
self.kreisDran=True
self.com=[["0","1","2"],["3","4","5"],["6","7","8"],["0","3","6"],["1","4","7"],["2","5","8"],["0","4","8"],["2","4","6"]]
self.fenster=Tk()
self.infromationLabel=Label(self.fenster,text="")
self.value=IntVar()
self.label=Label(self.fenster,text="Käsekästchen")
self.spielsteine=[
Checkbutton(self.fenster,indicatoron=0,height=6,width=15,onvalue=1,offvalue=1,variable=self.value,command=self.aktion),
Checkbutton(self.fenster,indicatoron=0,height=6,width=15,onvalue=2,offvalue=2,variable=self.value,command=self.aktion),
Checkbutton(self.fenster,indicatoron=0,height=6,width=15,onvalue=3,offvalue=3,variable=self.value,command=self.aktion),
Checkbutton(self.fenster,indicatoron=0,height=6,width=15,onvalue=4,offvalue=4,variable=self.value,command=self.aktion),
Checkbutton(self.fenster,indicatoron=0,height=6,width=15,onvalue=5,offvalue=5,variable=self.value,command=self.aktion),
Checkbutton(self.fenster,indicatoron=0,height=6,width=15,onvalue=6,offvalue=6,variable=self.value,command=self.aktion),
Checkbutton(self.fenster,indicatoron=0,height=6,width=15,onvalue=7,offvalue=7,variable=self.value,command=self.aktion),
Checkbutton(self.fenster,indicatoron=0,height=6,width=15,onvalue=8,offvalue=8,variable=self.value,command=self.aktion),
Checkbutton(self.fenster,indicatoron=0,height=6,width=15,onvalue=9,offvalue=9,variable=self.value,command=self.aktion)]
zählerZeile=0
zählerSpalte=-1
for i in self.spielsteine:
self.speicher.get(i)
zählerSpalte +=1
if zählerSpalte >=3:
zählerSpalte=0
zählerZeile +=1
i.grid(row=zählerZeile,column=zählerSpalte,pady=5,padx=5)
self.fenster.mainloop()
self.infromationLabel.pack(side=BOTTOM)
def aktion(self):
if self.kreisDran:
self.infromationLabel.config(text="Kreis ist an der Reihe")
self.kreisDran=False
self.kreuzDran=True
self.kreis(self.value.get())
elif self.kreuzDran:
self.infromationLabel.config(text="Kreuz ist an der Reihe")
self.kreisDran=True
self.kreuzDran=False
self.kreuz(self.value.get())
def kreis(self,value):
objekte=self.speicher.printOut()
einzelner_button=objekte[value]
einzelner_button.destroy()
value -=1
kreisLabel=Label(self.fenster,height=6,width=15,text="O",font=100)
row=value//3
column=value%3
kreisLabel.grid(row=row,column=column,pady=5,padx=5)
self._ordneEin(self.kreisFeld,value)
print(self.kreisFeld)
for i in self.kreisFeld:
if not "None" in i:
print(self.kreisFeld,"kreis")
raise Gewonnen("Kreis hat gewonnen")
def kreuz(self,value):
schublade=list()
objekte=self.speicher.printOut()
einzelner_button=objekte[value]
einzelner_button.destroy()
value -=1
kreisLabel=Label(self.fenster,height=6,width=15,text="X",font=100)
row=value//3
column=value%3
kreisLabel.grid(row=row,column=column,pady=5,padx=5)
self.kreuzFeld=self._ordneEin(self.kreuzFeld,value)
print(self.kreuzFeld)
for i in self.kreuzFeld:
if not "None" in i:
print(self.kreuzFeld,"kreuz")
raise Gewonnen("Kreuz hat gewonnen")
def _ordneEin(self,liste,value):
value=str(value)
for i in deepcopy(self.com):
for r in deepcopy(i):
if value==r:
deep=i.index(r)
shallow=self.com.index(i)
liste[shallow][deep]=value
a=Hintergrund(merker)