我正试图用4个过程来编写一个生命游戏,每个过程处理四分之一的细胞。这是我的问题:我使用tkinter的画布来显示单元格,我必须运行一个真正的循环来更新旁边的单元格,但我不知道如何做到这一点。
下面是我的完整代码:display函数是我需要运行tkinter-mainloop和canvas_fill函数的地方,后者有while-true循环。
其他功能如下:
- 种子产生第一个活细胞
- 管理每个子网格的mini_grid
from tkinter import *
import multiprocessing as mp
import time
#matrix size
size = 20
#seed
x_table = [7,7,8,8,8,9]
y_table = [4,5,4,5,6,6]
def display(Cells,window,PipeA):
#i,j,alive
canvas = Canvas(window,height='400',width='400')
canvas.pack()
window.mainloop()
canvas_fill(Cells,window,PipeA,canvas)
def canvas_fill(Cells, window, PipeA, canvas):
while True:
print("looping")
[i,j,alive]=PipeA.recv()
x= (i*20)-20
y= (j*20)-20
if alive == 0:
Cells[((i*size)+j)%(size**2)]=0
canvas.create_rectangle(x,y,x+20,y+20,fill='white')
else:
Cells[((i*size)+j)%(size**2)]=1
print("case vivante crée")
canvas.create_rectangle(x,y,x+20,y+20,fill='lime green')
def seed(Cells,lock,PipeB):
for i in range(len(x_table)):
with lock:
fill_cell(x_table[i],y_table[i],1,Cells,lock)
#envoyer par pipe
PipeB.send((x_table[i],y_table[i],1))
def mini_grid(id,Cells,lock,PipeB):
near = [-1,-9,-10,-11,+1,+9,+10,+11]
z=0
while z<10:
z+=1
for i in range(int(size*size/4)):
n=i//size #ligne n
p=i%size # colonne p
if id==1:
p=p+size
if id==2:
n=n+size
if id==3:
n=n+size
p=p+size
cells_alive_around = 0
for j in near:
if Cells[((n*size)+p+j)%(size*size)]==1:
cells_alive_around +=1
if Cells[((n*size)+p)%(size**2)] == 0:
#cellule morte
if cells_alive_around == 3:
#devient vivante
PipeB.send((n,p,1))
Cells[(n*size+p)%(size**2)]=1
else:
#cellule vivante
if cells_alive_around <2 or cells_alive_around >3:
#devient morte
PipeB.send((n,p,0))
print(n*size+p)
print('n ',n)
Cells[(n*size+p)%(size**2)]=0
time.sleep(2)
if __name__ == "__main__" :
size = 10*10 # grille 20*20 donc 4 sous-grilles 10*10
window = Tk()
window.title("Game of life")
lock = mp.Lock()
Cells = mp.Array('i',[0]*size**2)
Grids = [0,0,0,0]
PipeA,PipeB = mp.Pipe()
Display = mp.Process(target = display,args=(Cells,window,PipeA))
Display.start()
seed(Cells,lock,PipeB)
for i in range(4): #Création des 4 sous grilles
Grids[i] = mp.Process(target= mini_grid,args=(i,Cells,lock,PipeB))
Grids[i].start()
我认为您需要将canvas_fill((函数设置为以节奏运行。尝试实现此处找到的解决方案。tkinter-root.mainloop与While True循环
我不是这里的专家,但我希望这至少能让你走上正确的道路。
好吧,我发现我可以使用window.update((在while循环中,而不是在mainloop((中