如何解决Tkinter Canvas.itemconfigure使用不正确吗?
我目前正在尝试使用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
而不是1
的整数id来更改某些内容。如果您将不是整数的值传递给itemconfigure
,则画布会假定它是一个标记。由于没有元素带有标签1.0
,因此未配置任何元素。
如果将数组更改为容纳整数,以便不对数字进行转换,那么itemconfigure
会很好地工作。
Grille = ndarray(dim,dtype=int)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。