Tkinter Canvas.itemconfigure未正确使用?

2024-10-01 04:52:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试使用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()作为测试时,所有矩形都被设置为变黑


Tags: ineventforifdefrangeresprocess
1条回答
网友
1楼 · 发布于 2024-10-01 04:52:19

画布项被赋予一个整数标识符。必须使用整数来引用该项。诸如1.0之类的浮点数不引用整型标识符为1的项

代码中的问题是Grille是一个浮点数数组。当您执行Grille[i, j] = C.create_rectangle(...)时,create_rectangle将返回一个整数,但它将被存储为浮点。因此,对itemconfigure的调用尝试使用浮点数1.0而不是整数id 1来更改某些内容。如果将非整数的内容传递给itemconfigure,画布将假定它是一个标记。由于没有元素具有标记1.0,因此没有配置元素

如果将数组更改为保留整数,以便不转换数字,itemconfigure将正常工作

Grille = ndarray(dim, dtype=int)

相关问题 更多 >