【问题标题】:Tkinter update canvas colors for a number of objectsTkinter 更新许多对象的画布颜色
【发布时间】:2020-06-18 10:07:29
【问题描述】:

谁能帮我解决这个问题:我有一个字典列表,其中存储了未来 Tkinter 矩形的信息。一旦创建了矩形,我试图让它们根据“x”值的变化而改变颜色,但它只适用于最后创建的对象,而不适用于其余的对象,这是一个代码:

from tkinter import *

a = {
    "y":2,
    "len" : 4
    }


b = {
    "y":5,
    "len" : 7
    }


c = {
    "y":6,
    "len" : 8
    }


d = {
    "y":2,
    "len" : 4
    }


e = {
    "y":4,
    "len" : 12
    }


f = {
    "y":3,
    "len" : 10
    }


g = {
    "y":7,
    "len" : 10
    }


groupe = [a,d, b, c, g, e, f]

xt1 = 800
xt2= 800
yt1=720
yt2=0

master = Tk()
root = Canvas(master, width=800, height=720)
root.pack()

#Moving RedLine
def deplacer():
    global xt1, yt1, xt2, yt2
    xt1-=5
    xt2-=5
    root.coords(laser_print, xt1, yt1, xt2,yt2)
    root.after(50,deplacer)

    return

#drawing blocks

graf_dist = 0
dist_betw=0
untouched = "blue"
being_touched = "red"
touched= "gray"
block_color=untouched

for ensemble in groupe:

    graf_dist+=60
    dist_betw+=10

    xo=graf_dist+dist_betw
    yo=int(ensemble['y']*50)
    xl=xo+60
    yl=int(ensemble['len']*50)

    if xo<=xt1 and xl>xt1:
        block_color=being_touched
    elif xo<xt1 and xl<=xt1:
        block_color=untouched

    drawing_block = root.create_rectangle(xo, yo, xl, yl, fill=block_color, tag="blocks")


#draw horizontal redline
laser_print=root.create_line(xt1, yt1, xt2, yt2, fill="red")

#updating the color of the rectangles
def update_color():
    x_block=xt1+1
    untouched = "blue"
    being_touched = "red"
    touched= "gray"
    block_color=untouched   

    if xo<=x_block and xl>x_block:
        block_color=being_touched
    elif xo<x_block and xl<=x_block:
        block_color=untouched
    root.itemconfig(drawing_block, fill=block_color)
    root.after(50,update_color)

update_color()
deplacer()
mainloop()

【问题讨论】:

  • 仅适用于最后创建的对象xo 具有最后一个 .create_rectangle(x0, ... 的值,并且从未更改。您必须循环 创建的矩形 才能找到匹配的 xo。阅读Tkinter.Canvas.find_...-method's
  • 谢谢你,stovfl,要试试这个

标签: python tkinter


【解决方案1】:

好的,首先,你画了七个块,但它们都分配给了drawing_block。当您在update_color() 中引用drawing_block 时,这当然是最后一个块。

您需要做的第一件事是为每个块设置单独的对象,例如,将它们存储在列表中:

drawing_blocks = []
for ensemble in groups:
...
    drawing_blocks.append(root.create_rectangle(xo, yo, xl, yl, fill=block_color, tag="blocks"))

然后您需要更改update_color() 函数以测试激光是否通过每个单独的块,然后更改该特定块的颜色。

【讨论】:

  • 谢谢你,罗纳德,试试看!
  • update_color() 函数中,您应该访问每个单独块的 xo 和 xl。我相信你可以从列表中的块对象中获取它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
相关资源
最近更新 更多