微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Tkinter Canvas.itemconfigure使用不正确吗?

如何解决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 举报,一经查实,本站将立刻删除。