我目前正在尝试使用tkinter制作一个生活游戏。 但有一个问题:我创建的矩形不会响应为更改填充颜色而调用的itemconfigure方法。一旦tk窗口打开,似乎没有办法改变它们的颜色。。。下面是使用的代码:(变量名是法语的,很抱歉)
from tkinter import *
from numpy import *
Res = (1000, 1000)
dim = (50, 50)
BordABord = False
F = Tk()
C = Canvas(F, height = Res[1], width = Res[0])
L = ndarray(dim, dtype = bool)
Grille = ndarray(dim)
lar = []
for i in range(2):
lar.append(Res[i] // dim[i])
for i in range(dim[0]):
x = i * lar[0]
for j in range(dim[1]):
y = j * lar[1]
Grille[i, j] = C.create_rectangle(x, y, x + lar[0], y + lar[1], fill = 'white')
L[i, j] = False
def rgbTraducteur(rgb):
return "#%02x%02x%02x" % rgb
def process():
global L
global Grille
global dim
global C
for i in range(dim[0]):
for j in range(dim[1]):
if L[i, j]:
print('processssss')
C.itemconfigure(Grille[i, j], fill = 'black')
def clic(event):
print('clic')
global L
global Res
global dim
x = int(dim[0] * event.x / Res[0])
y = int(dim[1] * event.y / Res[1])
print(x, y)
L[x, y] = not(L[x, y])
process()
def pas(event = 0):
global L
global BordABord
global dim
N = L
for i in range(dim[0]):
for j in range(dim[1]):
compte = 0
for k in range(-1, 2):
x = i + k
if BordABord or x // dim[0] == 0:
x %= dim[0]
for l in range(-1, 2):
if l != 0 and k != 0:
y = j + l
if BordABord or y // dim[1] == 0:
y %= dim[1]
compte += L[x, y]
if L[i, j]:
N[i, j] = (compte - 2) // 2 == 0
else:
N[i, j] = compte == 3
L = N
process()
F.bind('<Button-1>', clic)
F.bind('<Return>', pas)
C.pack()
F.mainloop()
当然,它一点也没有得到优化,当调用process()作为测试时,所有矩形都被设置为变黑
画布项被赋予一个整数标识符。必须使用整数来引用该项。诸如
1.0
之类的浮点数不引用整型标识符为1
的项代码中的问题是
Grille
是一个浮点数数组。当您执行Grille[i, j] = C.create_rectangle(...)
时,create_rectangle
将返回一个整数,但它将被存储为浮点。因此,对itemconfigure
的调用尝试使用浮点数1.0
而不是整数id1
来更改某些内容。如果将非整数的内容传递给itemconfigure
,画布将假定它是一个标记。由于没有元素具有标记1.0
,因此没有配置元素如果将数组更改为保留整数,以便不转换数字,
itemconfigure
将正常工作相关问题 更多 >
编程相关推荐