You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter create_rectangle无法绘制图形问题求助

问题分析与解决方案

核心问题定位

你的代码中存在两个关键问题导致矩形无法显示:

  1. Canvas.pack()调用时机错误:将canv.pack()放在for循环内部,每次迭代重复执行布局操作,导致Canvas无法正确渲染后续绘制的矩形元素。
  2. 绘制顺序与坐标转换疏漏:先绘制文本再绘制矩形(即便矩形能显示也会覆盖文本),且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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 00:56:29