Tkinter create_rectangle无法绘制图形问题求助
问题分析与解决方案
核心问题定位
你的代码中存在两个关键问题导致矩形无法显示:
Canvas.pack()调用时机错误:将canv.pack()放在for循环内部,每次迭代重复执行布局操作,导致Canvas无法正确渲染后续绘制的矩形元素。- 绘制顺序与坐标转换疏漏:先绘制文本再绘制矩形(即便矩形能显示也会覆盖文本),且
lesson_data[3] * 70未做类型转换,若lesson_data[3]是字符串会导致坐标计算完全错误。
修正后的代码片段
elif command[0] == "show": root = tk.Tk() root.title("Jonjot v0.1") root.geometry("350x270") root.resizable(False, False) canv = tk.Canvas(root, width=350, height=270) canv.pack_propagate(False) canv.pack() # 移到循环外,仅执行一次布局 canv.delete("all") for lesson_data in memory[command[1]][command[2]].values(): # 先绘制矩形作为背景 col_idx = int(lesson_data[3]) color = subject_color[lesson_data[4]][0] canv.create_rectangle( (col_idx - 1) * 70 + 1, lesson_data[5], col_idx * 70, lesson_data[6], fill=color ) # 再绘制文本,确保文本在矩形上方 canv.create_text((col_idx - 1) * 70 + 1, lesson_data[5] // 2, text=lesson_data[0], font=("Helvetica", 7), fill=subject_color[lesson_data[4]][1], anchor="nw") canv.create_text(col_idx * 70, lesson_data[5] // 2, text=lesson_data[4], font=("Helvetica", 7), fill=subject_color[lesson_data[4]][1], anchor="ne") canv.create_text((col_idx - 1) * 70 + 1, lesson_data[6] // 2, text=lesson_data[1], font=("Helvetica", 7), fill=subject_color[lesson_data[4]][1], anchor="sw") canv.create_text(col_idx * 70, lesson_data[6] // 2, text=lesson_data[2], font=("Helvetica", 7), fill=subject_color[lesson_data[4]][1], anchor="se") root.mainloop()
关键修正说明
- 将
canv.pack()移至循环外:确保Canvas仅完成一次布局初始化,后续绘制的元素能正确渲染。 - 提前转换列索引类型:把
lesson_data[3]转为整数后再计算坐标,避免字符串重复运算导致的坐标错误。 - 调整绘制顺序:先画矩形背景,再画文本,符合日程表的视觉层级逻辑。
验证步骤
替换修正后的代码片段,按原流程加载JSON文件并执行show class 7E命令,即可看到矩形背景与文本正常显示。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

