Tkinter Button erzeugt indent error
"indent" ist die Einrückung. Und die ist ganz offensichtlich falsch. Falls das für Dich nicht offensichtlich ist, arbeite bitte erst einmal ein Tutorial mit den Grundlagen durch, bevor Du GUI-Programme erweiterst.
Nichtsdestotrotz: Es ist ziemlich offensichtlich, dass du dabei bist, mit Code, der nicht von dir ist, irgendwie herumzubasteln ohne wirklich zu verstehen, was du da tust.
Du wirst deutlich mehr vom Programmieren haben, wenn du anders herangehst: Nimm dir Zeit, ein gutes Tutorial durchzuarbeiten, experimentiere, entwickle eigene kleinere Programme, verstehe OOP, nimm dir dann Tkinter vor, experimentiere damit, entwickle eigene kleinere GUI-Programme und dann, irgendwann, entwickle dein eigenes Tetris-Programm ...
Du wirst deutlich mehr vom Programmieren haben, wenn du anders herangehst: Nimm dir Zeit, ein gutes Tutorial durchzuarbeiten, experimentiere, entwickle eigene kleinere Programme, verstehe OOP, nimm dir dann Tkinter vor, experimentiere damit, entwickle eigene kleinere GUI-Programme und dann, irgendwann, entwickle dein eigenes Tetris-Programm ...
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
ausserdem wird es kein Tetris ....
ausserdem wird es kein Tetris ....
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 ....
Und jetzt frag ich mich natürlich, warum du den Code nachträglich oben entfernt hast ...
vorher liefs nicht jetzt läuft es würde ich an dieser Stelle lügen würde ich mir doch ins eigene Bein schiessenDas "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 ..
@zacazulu: Ich verstehe jetzt nicht, warum du mir folgendes als PM schickst.
Aber vielleicht gibt es sonst jemanden, der dir behilflich ist, darum poste ich deine PM mal hier ...
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 !
Aber vielleicht gibt es sonst jemanden, der dir behilflich ist, darum poste ich deine PM mal hier ...
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Naja, wenn es darauf hinausläuft dass du sobald die Lösung da ist den problematischen Code löschst und den Thread für alle außer dir unnütz machst (es soll ja Leute geben die nach dir das selbe Problem haben könnten) dann habe ich zumindest kaum Motivation mir da irgendwas zu überlegen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Neue Version:
ich habe das zeug in eine loop gebracht, allerdings möchte ich nicht dass es mir nur das endergebnis (also von for x in range(20) nur dann das 20.te) im Gridraster anzeigt sondern auch die einzelnen Teilschritte/die Entwicklung.
Wäre sehr dankbar für jeglichen Input!
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()
Wäre sehr dankbar für jeglichen Input!
Zuletzt geändert von zacazulu am Dienstag 25. November 2008, 23:41, insgesamt 4-mal geändert.
Hallo zacazulu
Vorab eine kleine Korrektur in Zeile 81..84:
Gruss wuf
Vorab eine kleine Korrektur in Zeile 81..84:
Code: Alles auswählen
def laufen():
for x in range(10):
grid.schritt()
print x
Take it easy Mates!
Hallo zacazulu !
gruss frank
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()
danke vielmals frank!
mein finaler code sieht demnach so aus :
mein finaler code sieht demnach so aus :
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()