Tkinter Button erzeugt indent error
Verfasst: Dienstag 25. November 2008, 19:25
Gelöst!
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Das "after" kannst du in die Tonne hauen. Hat schon seinen Grund, dass es praktisch nicht dokumentiert ist: Weil man es vermutlich (so gut wie) nie braucht, im Fall deines Codes schon gar nicht, weil die pack()-Reihenfolge der Reihenfolge des Aufrufs entspricht und insofern ist "after" hier redundant.zacazulu hat geschrieben:Problem ist gelöst; es lag daran dass es after= buttonSchritt sein sollte und nicht after=buttonClear ... hätte ja sein können dass irgend ein crack das gesehen hätte und mir einige minuten erspart hätte
Dann solltest du, wenn du schon fremden Code umstricken willst, wenigstens den Fenster-Titel ändern, bevor du so etwas postest.zacazulu hat geschrieben:ausserdem wird es kein Tetris ....
vorher liefs nicht jetzt läuft esDas "after" kannst du in die Tonne hauen. Hat schon seinen Grund, dass es praktisch nicht dokumentiert ist: Weil man es vermutlich (so gut wie) nie braucht, im Fall deines Codes schon gar nicht, weil die pack()-Reihenfolge der Reihenfolge des Aufrufs entspricht und insofern ist "after" hier redundant.
Der Titel ist von mir und ist als Witz gemeint .... weil es in wahrheit ein game of life wirdDann solltest du, wenn du schon fremden Code umstricken willst, wenigstens den Fenster-Titel ändern, bevor du so etwas postest.
weil ich es kannUnd jetzt frag ich mich natürlich, warum du den Code nachträglich oben entfernt hast ..
Jawoll, das ist echte Programmierkunst.zacazulu hat geschrieben:vorher liefs nicht jetzt läuft es
Dann viel Erfolg.zacazulu hat geschrieben:weil ich es kann
Ich habe meine Ansicht zu einer vernünftigen Vorgehensweise ja schon gepostet. Dem habe ich auch nichts hinzuzufügen.zacazulu hat geschrieben:Hi,
Ich zerbreche mir nun schon seit einem Weilchen daran meinen Kopf:Was mein Ziel ist? Einen Button hinzuzufügen der die einzelnen Steps unendlich lange weiterführt bei einmal klicken (und dann evtl. wieder aufhört wenn man wieder draufklickt), so dass das halt auch ordentlich aussieht mit dem game of life. Wie ich das machen wollte: einfach den Inhalt von grid.schritt in eine loop (vielleicht 500er schritte oder so) schreiben mit hilfe vonCode: Alles auswählen
#!/usr/bin/env python # encoding: utf-8 from Tkinter import * import random root = Tk() root.title("Lets Play some Tetris!") class Zelle(Label): DEAD = 0 LIVE = 1 def __init__(self,parent): Label.__init__(self,parent,relief="raised",width=2,borderwidth=1) self.bind("<Button-1>", self.toggle) self.displayState(Zelle.DEAD) def toggle(self,event): self.displayState(1-self.state) def setNextState(self,Nachbaren): if self.state==Zelle.LIVE and \ (Nachbaren>3 or Nachbaren<2): self.nextState = Zelle.DEAD elif self.state==Zelle.DEAD and Nachbaren==3: self.nextState = Zelle.LIVE else: self.nextState = self.state def schrittToNextState(self): self.displayState(self.nextState) def displayState(self,newstate): self.state = newstate if self.state==Zelle.LIVE: self["bg"] = "#FF9900" else: self["bg"] = "#009999" class Grid: def __init__(self,parent,sizex,sizey): self.sizex = sizex self.sizey = sizey self.Zellen = [] for a in range(0,self.sizex): rowZellen = [] for b in range(0,self.sizey): c = Zelle(parent) c.grid(row=b, column=a) rowZellen.append(c) self.Zellen.append(rowZellen) if sizex>10 and sizey>10: #beginnt mit zufaelligen Zahlen for i in range(500): self.Zellen[random.randint(1,39)][random.randint(1,39)].displayState(Zelle.LIVE) print i def schritt(self): Zellen = self.Zellen for x in range(0,self.sizex): if x==0: x_unten = self.sizex-1 else: x_unten = x-1 if x==self.sizex-1: x_oben = 0 else: x_oben = x+1 for y in range(0,self.sizey): if y==0: y_unten = self.sizey-1 else: y_unten = y-1 if y==self.sizey-1: y_oben = 0 else: y_oben = y+1 sum = Zellen[x_unten][y].state + Zellen[x_oben][y].state + \ Zellen[x][y_unten].state + Zellen[x][y_oben].state + \ Zellen[x_unten][y_unten].state + Zellen[x_oben][y_oben].state + \ Zellen[x_unten][y_oben].state + Zellen[x_oben][y_unten].state Zellen[x][y].setNextState(sum) for row in Zellen: for Zelle in row: Zelle.schrittToNextState() def clear(self): for row in self.Zellen: for Zelle in row: Zelle.displayState(Zelle.DEAD) ##def laufen(self): #Zellen = self.Zellen #for x in range(0,self.sizex): #if x==0: x_unten = self.sizex-1 #else: x_unten = x-1 #if x==self.sizex-1:x_oben = 0 #else: x_oben= x+1 #for y in range(0,self.sizey): # if y==0: y_unten = y_oben = 0 # else: y_unten= y-1 # if y==self.sizey-1: y_oben = 0 # else: y_oben = y+1 # sum= Zellen[x_unten][y].state + Zellen[x_oben][y].state + \ # Zellen[x][y_unten].state + Zellen[x][y_oben].state + \ # Zellen[x_unten][y_unten].state + Zellen[x_oben][y_oben].state + \ # Zellen[x_unten][y_oben].state + Zellen[x_oben][y_unten].state # Zellen[x][y].setNextState(sum) #for row in Zellen: # for Zelle in row: # Zelle.laufenToNextState() if __name__ == "__main__": frame = Frame(root) frame.pack() grid = Grid(frame,40,40) bottomFrame = Frame(root) bottomFrame.pack(side=BOTTOM) buttonSchritt = Button(bottomFrame,text="Schritt machen",command=grid.schritt) buttonSchritt.pack(side=LEFT) buttonClear = Button(bottomFrame,text="Clear",command=grid.clear) buttonClear.pack(side=LEFT,after=buttonSchritt) buttonLaufen = Button(bottomFrame,text="Laufen lassen",command=) buttonLaufen.pack(side=LEFT,after=buttonSchritt) root.mainloop()
for e in range(500): XXX print e .
das klappt aber nicht weil er dann Probleme mit dem Attribut bekommt... und hier setzt mein Gehirn komplett aus.
Wäre sogar für Gedankenschnipsel dankbar !
Verstehe ich nicht.zacazulu hat geschrieben:vielleicht will ich ja nicht dass die ganze welt den ganzen code sehen kann...
auch egal...Verstehe ich nicht.
Code: Alles auswählen
#!/usr/bin/env python
# encoding: utf-8
from Tkinter import *
import random
root = Tk()
root.title("Djumandji!")
class Zelle(Label):
TOT = 0
LEBT = 1
def __init__(self,parent):
Label.__init__(self,parent,relief="raised",width=2,borderwidth=1)
self.bind("<Button-1>", self.toggle)
self.displaygeneration(Zelle.TOT)
def toggle(self,event):
self.displaygeneration(1-self.generation)
def setzeNeueGeneration(self,Nachbaren):
if self.generation==Zelle.LEBT and \
(Nachbaren>3 or Nachbaren<2):
self.nextgeneration = Zelle.TOT
elif self.generation==Zelle.TOT and Nachbaren==3:
self.nextgeneration = Zelle.LEBT
else:
self.nextgeneration = self.generation
def schrittToNextgeneration(self):
self.displaygeneration(self.nextgeneration)
def displaygeneration(self,newgeneration):
self.generation = newgeneration
if self.generation==Zelle.LEBT:
self["bg"] = "#FF9900"
else:
self["bg"] = "#009999"
class Grid:
def __init__(self,parent,sizex,sizey):
self.sizex = sizex
self.sizey = sizey
self.Zellen = []
for a in range(0,self.sizex):
rowZellen = []
for b in range(0,self.sizey):
c = Zelle(parent)
c.grid(row=b, column=a)
rowZellen.append(c)
self.Zellen.append(rowZellen)
if sizex>10 and sizey>10:
#beginnt mit zufaelligen Zahlen
for i in range(500):
self.Zellen[random.randint(1,39)][random.randint(1,39)].displaygeneration(Zelle.LEBT)
print i
def schritt(self):
Zellen = self.Zellen
for x in range(0,self.sizex):
if x==0: x_unten = self.sizex-1
else: x_unten = x-1
if x==self.sizex-1: x_oben = 0
else: x_oben = x+1
for y in range(0,self.sizey):
if y==0: y_unten = self.sizey-1
else: y_unten = y-1
if y==self.sizey-1: y_oben = 0
else: y_oben = y+1
sum = Zellen[x_unten][y].generation + Zellen[x_oben][y].generation + \
Zellen[x][y_unten].generation + Zellen[x][y_oben].generation + \
Zellen[x_unten][y_unten].generation + Zellen[x_oben][y_oben].generation + \
Zellen[x_unten][y_oben].generation + Zellen[x_oben][y_unten].generation
Zellen[x][y].setzeNeueGeneration(sum)
for row in Zellen:
for Zelle in row:
Zelle.schrittToNextgeneration()
def clear(self):
for row in self.Zellen:
for Zelle in row:
Zelle.displaygeneration(Zelle.TOT)
def laufen():
for x in range(10):
grid.schritt()
zelle.displaygeneration()
print x
if __name__ == "__main__":
frame = Frame(root)
frame.pack()
grid = Grid(frame,40,40)
bottomFrame = Frame(root)
bottomFrame.pack(side=BOTTOM)
buttonSchritt = Button(bottomFrame,text="Schritt machen",command=grid.schritt)
buttonSchritt.pack(side=LEFT)
buttonClear = Button(bottomFrame,text="Clear",command=grid.clear)
buttonClear.pack(side=LEFT,after=buttonSchritt)
buttonLaufen = Button(bottomFrame,text="Laufen lassen",command=laufen)
buttonLaufen.pack(side=LEFT,after=buttonSchritt)
root.mainloop()
Code: Alles auswählen
def laufen():
for x in range(10):
grid.schritt()
print x
Code: Alles auswählen
def laufen(root, counter):
if counter > 0:
grid.schritt()
counter -=1
root.after(100, laufen, root, counter)
if __name__ == "__main__":
frame = Frame(root)
frame.pack()
grid = Grid(frame,20, 20)
bottomFrame = Frame(root)
bottomFrame.pack(side=BOTTOM)
buttonSchritt = Button(bottomFrame,text="Schritt machen",command=grid.schritt)
buttonSchritt.pack(side=LEFT)
buttonClear = Button(bottomFrame,text="Clear",command=grid.clear)
buttonClear.pack(side=LEFT,after=buttonSchritt)
buttonLaufen = Button(bottomFrame,text="Laufen lassen",
command=lambda counter=10, root=root: laufen(root, counter))
buttonLaufen.pack(side=LEFT,after=buttonSchritt)
root.mainloop()
Code: Alles auswählen
#!/usr/bin/env python
# encoding: utf-8
from Tkinter import *
import random
root = Tk()
root.title("Djumandji!")
class Zelle(Label):
TOT = 0
LEBT = 1
def __init__(self,parent):
Label.__init__(self,parent,relief="raised",width=2,borderwidth=1)
self.bind("<Button-1>", self.toggle)
self.displaygeneration(Zelle.TOT)
def toggle(self,event):
self.displaygeneration(1-self.generation)
def setzeNeueGeneration(self,Nachbaren):
if self.generation==Zelle.LEBT and \
(Nachbaren>3 or Nachbaren<2):
self.nextgeneration = Zelle.TOT
elif self.generation==Zelle.TOT and Nachbaren==3:
self.nextgeneration = Zelle.LEBT
else:
self.nextgeneration = self.generation
def schrittToNextgeneration(self):
self.displaygeneration(self.nextgeneration)
def displaygeneration(self,newgeneration):
self.generation = newgeneration
if self.generation==Zelle.LEBT:
self["bg"] = "#FF9900"
else:
self["bg"] = "#009999"
class Grid:
def __init__(self,parent,sizex,sizey):
self.sizex = sizex
self.sizey = sizey
self.Zellen = []
for a in range(0,self.sizex):
rowZellen = []
for b in range(0,self.sizey):
c = Zelle(parent)
c.grid(row=b, column=a)
rowZellen.append(c)
self.Zellen.append(rowZellen)
if sizex>10 and sizey>10:
#beginnt mit zufaelligen Zahlen
for i in range(500):
self.Zellen[random.randint(1,39)][random.randint(1,39)].displaygeneration(Zelle.LEBT)
print i
def schritt(self):
Zellen = self.Zellen
for x in range(0,self.sizex):
if x==0: x_unten = self.sizex-1
else: x_unten = x-1
if x==self.sizex-1: x_oben = 0
else: x_oben = x+1
for y in range(0,self.sizey):
if y==0: y_unten = self.sizey-1
else: y_unten = y-1
if y==self.sizey-1: y_oben = 0
else: y_oben = y+1
sum = Zellen[x_unten][y].generation + Zellen[x_oben][y].generation + \
Zellen[x][y_unten].generation + Zellen[x][y_oben].generation + \
Zellen[x_unten][y_unten].generation + Zellen[x_oben][y_oben].generation + \
Zellen[x_unten][y_oben].generation + Zellen[x_oben][y_unten].generation
Zellen[x][y].setzeNeueGeneration(sum)
for row in Zellen:
for Zelle in row:
Zelle.schrittToNextgeneration()
def clear(self):
for row in self.Zellen:
for Zelle in row:
Zelle.displaygeneration(Zelle.TOT)
def laufen(root, counter):
if counter > 0:
grid.schritt()
counter -=1
root.after(100, laufen, root, counter)
if __name__ == "__main__":
frame = Frame(root)
frame.pack()
grid = Grid(frame,40,40)
bottomFrame = Frame(root)
bottomFrame.pack(side=BOTTOM)
buttonSchritt = Button(bottomFrame,text="Schritt machen",command=grid.schritt)
buttonSchritt.pack(side=LEFT)
buttonClear = Button(bottomFrame,text="Clear",command=grid.clear)
buttonClear.pack(side=LEFT,after=buttonSchritt)
buttonLaufen = Button(bottomFrame,text="Laufen lassen",command=lambda counter=100, root=root: laufen(root, counter))
buttonLaufen.pack(side=LEFT,after=buttonSchritt)
root.mainloop()