Tkinter Button erzeugt indent error

Fragen zu Tkinter.
Antworten
zacazulu
User
Beiträge: 8
Registriert: Dienstag 25. November 2008, 19:11

Gelöst!
Zuletzt geändert von zacazulu am Dienstag 25. November 2008, 20:50, insgesamt 2-mal geändert.
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.
zacazulu
User
Beiträge: 8
Registriert: Dienstag 25. November 2008, 19:11

hallo,


das liegt daran dass ich das beispiel hier editiert habe und vergessen habe einzurücken...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ...
zacazulu
User
Beiträge: 8
Registriert: Dienstag 25. November 2008, 19:11

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 ....
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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)
zacazulu
User
Beiträge: 8
Registriert: Dienstag 25. November 2008, 19:11

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)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

@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:
zacazulu
User
Beiträge: 8
Registriert: Dienstag 25. November 2008, 19:11

vielleicht will ich ja nicht dass die ganze welt den ganzen code sehen kann... :roll:
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

zacazulu hat geschrieben:vielleicht will ich ja nicht dass die ganze welt den ganzen code sehen kann... :roll:
Verstehe ich nicht.
zacazulu
User
Beiträge: 8
Registriert: Dienstag 25. November 2008, 19:11

Verstehe ich nicht.
auch egal...


bin immer noch am selben problem...
Leonidas
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
zacazulu
User
Beiträge: 8
Registriert: Dienstag 25. November 2008, 19:11

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!
Zuletzt geändert von zacazulu am Dienstag 25. November 2008, 23:41, insgesamt 4-mal geändert.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

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
zacazulu
User
Beiträge: 8
Registriert: Dienstag 25. November 2008, 19:11

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