Spiel des Lebens

Fragen zu Tkinter.
Antworten
wolfsblut
User
Beiträge: 4
Registriert: Sonntag 4. Dezember 2016, 00:11

Hallo:)
Ich bin kein Profiprogrammierer und habe ein Problem bei einer Tkinterschleife. :?
Der Code zum Spiel des Lebens funktioniert alles schon nur die Ausgabe nochnicht richtig. :roll:
Wer sich den ganzen Code unten nicht auschauen will, es geht mir nur um den Schluss, es sollen in Tkinter die Quadrate in der Farbe ausgegeben, die in der Liste mit 1 und 0 gespeichert sind. Das ganze klappt auch schon aber nur krieg ich es nicht hin das ganze in eine Schleife zu packen, also dass sie Generationen danach,als Simulation sozusagen, dann auch noch ausgegeben werden.
Hoffe jmd kann mir helfen :)

Gruß ein begeisterter Infomatikliebhaber


Code: Alles auswählen

from tkinter import *
from time import sleep
#####Definitionen#####

def kopie(welt):
    kopie=[]
    for zeile in welt:
        kopie= kopie+[zeile[:]]
    return kopie

def AnzahlNachbarn(x,y,welt,feldgröße):
    lebend=0
    help1=str(x)+str(y)  #Koordinaten als String
    x=int(x)-1                 #Anfang des Durchlaufs nach links oben verschoben
    y=int(y)-1
    for i in range(3):      #Zeilen werden durchlaufen
        for j in range(3):  #Spalten werden durchlaufen
            x2=x+j          
            y2=y+i
            help2=str(x2)+str(y2) 
            if help1!= help2:       #Kontrolle, dass Koordnate nicht durchlaufen wird
                if 0<=x2<=(feldgröße-1) and 0<=y2<=(feldgröße-1):   #Kontrolle,dass Feldgröße nicht überschritten wird
                    
                    lebend+=welt[x2][y2]     
    
    return lebend

def neueWelt(welt,feldgröße):
    kopieWelt=kopie(welt)
    for i in range(feldgröße):
        for j in range(feldgröße):
            anzahl=AnzahlNachbarn(i,j,welt,feldgröße)
            if welt[i][j] == 0 and anzahl == 3:
                kopieWelt[i][j]=1
            elif welt[i][j] ==1 and anzahl < 2:
                kopieWelt[i][j]=0
            elif welt[i][j]==1 and anzahl > 3:
                kopieWelt[i][j]=0
    return kopieWelt

def tkfeld(feldgröße,pixelgröße,welt):          #Anzahl der Felder im Quadrat
    
    #Quadrate kreieren
    for i in range(feldgröße+1):
        for j in range(feldgröße+1):
            #print(welt[i-(feldgröße)][j-(feldgröße-1)])
            a=welt[j-(feldgröße)][i-(feldgröße)]
            if a==0:
                w.create_rectangle(pixelgröße+pixelgröße*(i-1),pixelgröße+pixelgröße (j-1),pixelgröße+pixelgröße*i,pixelgröße+pixelgröße*j,fill='black',outline='Red')
            elif a==1:
                w.create_rectangle(pixelgröße+pixelgröße*(i-1),pixelgröße+pixelgröße*(j-1),pixelgröße+pixelgröße*i,pixelgröße+pixelgröße*j,fill='green',outline='Red')

   

##Hauptprogramm##
    
welt=[[0,0,0,0,0,0],[0,1,0,0,1,0],[0,0,0,0,0,0],[1,0,0,0,0,1],[1,1,1,1,1,1],[0,0,0,0,0,0]]

feldgröße=6


master = Tk()                                   #Grafikfenster öffnen
master.title("Spiel des Lebens ©Sebastian")     # Titel des Fenster setzen
canvas_width = 100*feldgröße                    #Größe festlegen
canvas_height =100*feldgröße

w = Canvas(master, width=canvas_width, height=canvas_height)
w.grid(row=0, column=0, pady = 20)




print(neueWelt(welt,feldgröße))
tkfeld(feldgröße,100,welt)

welt1=neueWelt(welt,6)
z=0
while z==0:
    sleep(1)
    neueWelt(welt1,6)
    sleep(1)
    tkfeld(6,100,welt1)
    
    welt1=neueWelt(welt1,6)
    mainloop()
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi wolfsblut

Habe dein Skript so abgeändert, dass etwas läuft. Betreffs Python-Programmierstil musst du dich unter:
PEP 8 -- Style Guide for Python Code
https://www.python.org/dev/peps/pep-0008/
selber schlau machen.

Der Anweisungsblock 'while' mit 'sleep()' sollte bei Tkinter mittels widget.after() durchgeführt werden.

Hier dein modifiziertes Skript:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

from tkinter import *
#from time import sleep
#####Definitionen#####

SLEEP_TIME = 1000 # Millisekunden
 
def kopie(welt):
    kopie=[]
    for zeile in welt:
        kopie= kopie+[zeile[:]]
    return kopie
 
def AnzahlNachbarn(x,y,welt,feldgröße):
    lebend=0
    help1=str(x)+str(y)  #Koordinaten als String
    x=int(x)-1                 #Anfang des Durchlaufs nach links oben verschoben
    y=int(y)-1
    for i in range(3):      #Zeilen werden durchlaufen
        for j in range(3):  #Spalten werden durchlaufen
            x2=x+j          
            y2=y+i
            help2=str(x2)+str(y2)
            if help1!= help2:       #Kontrolle, dass Koordnate nicht durchlaufen wird
                if 0<=x2<=(feldgröße-1) and 0<=y2<=(feldgröße-1):   #Kontrolle,dass Feldgröße nicht überschritten wird
                   
                    lebend+=welt[x2][y2]    
   
    return lebend
 
def neueWelt(welt,feldgröße):
    kopieWelt=kopie(welt)
    for i in range(feldgröße):
        for j in range(feldgröße):
            anzahl=AnzahlNachbarn(i,j,welt,feldgröße)
            if welt[i][j] == 0 and anzahl == 3:
                kopieWelt[i][j]=1
            elif welt[i][j] ==1 and anzahl < 2:
                kopieWelt[i][j]=0
            elif welt[i][j]==1 and anzahl > 3:
                kopieWelt[i][j]=0
    return kopieWelt
 
def tkfeld(feldgröße,pixelgröße,welt):          #Anzahl der Felder im Quadrat
   
    #Quadrate kreieren
    for i in range(feldgröße+1):
        for j in range(feldgröße+1):
            #print(welt[i-(feldgröße)][j-(feldgröße-1)])
            a=welt[j-(feldgröße)][i-(feldgröße)]
            if a==0:
                #w.create_rectangle(pixelgröße+pixelgröße*(i-1),pixelgröße+pixelgröße (j-1),pixelgröße+pixelgröße*i,pixelgröße+pixelgröße*j,fill='black',outline='Red')
                w.create_rectangle(pixelgröße+pixelgröße*(i-1),pixelgröße+pixelgröße*(j-1),pixelgröße+pixelgröße*i,pixelgröße+pixelgröße*j,fill='black',outline='Red')
            elif a==1:
                w.create_rectangle(pixelgröße+pixelgröße*(i-1),pixelgröße+pixelgröße*(j-1),pixelgröße+pixelgröße*i,pixelgröße+pixelgröße*j,fill='green',outline='Red')
 
   
def animate(toggle=True):
    if toggle:
        neueWelt(master.welt1,6)
    else:
        tkfeld(6, 100, master.welt1)
        master.welt1 = neueWelt(master.welt1,6)
    
    toggle = not toggle
    
    master.after(SLEEP_TIME, animate, toggle)
        
    
##Hauptprogramm##
   
welt=[[0,0,0,0,0,0],[0,1,0,0,1,0],[0,0,0,0,0,0],[1,0,0,0,0,1],[1,1,1,1,1,1],[0,0,0,0,0,0]]
 
feldgröße=6
 
 
master = Tk()                                   #Grafikfenster öffnen
master.title("Spiel des Lebens ©Sebastian")     # Titel des Fenster setzen
canvas_width = 100*feldgröße                    #Größe festlegen
canvas_height =100*feldgröße
 
w = Canvas(master, width=canvas_width, height=canvas_height)
w.grid(row=0, column=0, pady = 20)
 
 
 
 
print(neueWelt(welt,feldgröße))
tkfeld(feldgröße,100,welt)
 
#welt1=neueWelt(welt,6)
master.welt1 = neueWelt(welt,6)
z=0
#while z==0:
    #sleep(1)
    #neueWelt(welt1,6)
    #sleep(1)
    #tkfeld(6,100,welt1)
   
    #welt1=neueWelt(welt1,6)
animate()

mainloop()
Gruss wuf :wink:
Take it easy Mates!
wolfsblut
User
Beiträge: 4
Registriert: Sonntag 4. Dezember 2016, 00:11

Hi,
erstmal danke für die deine Bemühungen, war mir eine große Hilfe, so macht programmieren Spaß! Geile Seite hier :D
wuf hat geschrieben:
Habe dein Skript so abgeändert, dass etwas läuft. Betreffs Python-Programmierstil musst du dich unter:
PEP 8 -- Style Guide for Python Code
https://www.python.org/dev/peps/pep-0008/
selber schlau machen.
PEP 8 hört sich interessant an, hab davor nochnie davon gehört aber Struktur kingt immer gut :)


Gruß Sebastian:)
Antworten