需求:
我现在有一个列表,里面放着一系列的key,每一个key有length和state两个属性,所有length之和为sum_length。
我的需求是:我需要在屏幕上显示一个矩形,它展示所有key的状态。
遍历列表,如果key[i].state==“blue”,就把矩形的key[i].length/sumLength这个比例宽的部分涂为蓝色。
如果key[i].state==“red”,则涂为红色。
直到整个矩形被划分为红色的块和蓝色的块(每一个块的高和矩形的高是一样的)。
实现代码如下:
import tkinter as tk
dictx = {
"key1": {"length": 2, "state": "red"},
"key2": {"length": 3, "state": "blue"},
"key3": {"length": 5, "state": "red"},
}
root = tk.Tk()
cv = tk.Canvas(root, bg='white', height=800, width=800)
cv.pack()
def gen_text(dictx):
txt = ""
sum_length = 0
for k, v in dictx.items():
length = v['length']
sum_length += length
txt += f"{k}: length={length}, state={v['state']};"
txt = f"{txt[:-1]}.sum_length={sum_length}\n列表内容:{list(dictx.keys())}"
return txt, sum_length
def draw_rectangle(x0, y0, x1, y1, color="red"):
cv.create_rectangle(x0, y0, x1, y1, fill=color)
def draw_rectangles(dictx, sum_length):
y0, y1 = 50, 200
x0 = 10
rectangle_width = 500
for k, v in dictx.items():
length = v["length"]
state = v["state"]
x1 = x0 + length / sum_length * rectangle_width
draw_rectangle(x0, y0, x1, y1, state)
x0 = x1
txt, sum_length = gen_text(dictx)
cv.create_text(400, 20, text=txt)
draw_rectangles(dictx, sum_length)
root.mainloop()
效果如下: