Seite 1 von 1

Tkinter Button erzeugt indent error

Verfasst: Dienstag 25. November 2008, 19:25
von zacazulu
Gelöst!

Verfasst: Dienstag 25. November 2008, 19:37
von BlackJack
"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.

Verfasst: Dienstag 25. November 2008, 20:25
von zacazulu
hallo,


das liegt daran dass ich das beispiel hier editiert habe und vergessen habe einzurücken...

Verfasst: Dienstag 25. November 2008, 20:39
von numerix
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 ...

Verfasst: Dienstag 25. November 2008, 20:49
von zacazulu
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 :wink:


ausserdem wird es kein Tetris ....

Verfasst: Dienstag 25. November 2008, 21:10
von numerix
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
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:ausserdem wird es kein Tetris ....
Dann solltest du, wenn du schon fremden Code umstricken willst, wenigstens den Fenster-Titel ändern, bevor du so etwas postest.

Und jetzt frag ich mich natürlich, warum du den Code nachträglich oben entfernt hast ... 8)

Verfasst: Dienstag 25. November 2008, 21:17
von zacazulu
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.
vorher liefs nicht jetzt läuft es :wink: würde ich an dieser Stelle lügen würde ich mir doch ins eigene Bein schiessen

Dann solltest du, wenn du schon fremden Code umstricken willst, wenigstens den Fenster-Titel ändern, bevor du so etwas postest.
Der Titel ist von mir und ist als Witz gemeint .... weil es in wahrheit ein game of life wird :roll:

Und jetzt frag ich mich natürlich, warum du den Code nachträglich oben entfernt hast ..
weil ich es kann 8)

Verfasst: Dienstag 25. November 2008, 21:31
von numerix
zacazulu hat geschrieben:vorher liefs nicht jetzt läuft es
Jawoll, das ist echte Programmierkunst. :lol:
zacazulu hat geschrieben:weil ich es kann 8)
Dann viel Erfolg.

Verfasst: Dienstag 25. November 2008, 21:51
von numerix
@zacazulu: Ich verstehe jetzt nicht, warum du mir folgendes als PM schickst.
zacazulu hat geschrieben:Hi,

Ich zerbreche mir nun schon seit einem Weilchen daran meinen Kopf:

Code: 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()
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 von
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 ! :wink:
Ich habe meine Ansicht zu einer vernünftigen Vorgehensweise ja schon gepostet. Dem habe ich auch nichts hinzuzufügen.

Aber vielleicht gibt es sonst jemanden, der dir behilflich ist, darum poste ich deine PM mal hier ... :wink:

Verfasst: Dienstag 25. November 2008, 21:57
von zacazulu
vielleicht will ich ja nicht dass die ganze welt den ganzen code sehen kann... :roll:

Verfasst: Dienstag 25. November 2008, 22:04
von numerix
zacazulu hat geschrieben:vielleicht will ich ja nicht dass die ganze welt den ganzen code sehen kann... :roll:
Verstehe ich nicht.

Verfasst: Dienstag 25. November 2008, 22:12
von zacazulu
Verstehe ich nicht.
auch egal...


bin immer noch am selben problem...

Verfasst: Dienstag 25. November 2008, 22:43
von Leonidas
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.

Verfasst: Dienstag 25. November 2008, 23:10
von zacazulu
Neue Version:

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()
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!

Verfasst: Dienstag 25. November 2008, 23:27
von wuf
Hallo zacazulu

Vorab eine kleine Korrektur in Zeile 81..84:

Code: Alles auswählen

def laufen():
    for x in range(10):
        grid.schritt()
        print x
Gruss wuf :wink:

Verfasst: Dienstag 25. November 2008, 23:42
von kaytec
Hallo zacazulu !

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() 
gruss frank

Verfasst: Mittwoch 26. November 2008, 00:03
von zacazulu
danke vielmals frank!

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()