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

如何将Tkinter Entry表格转为不可编辑表格?添加表头与时段列

问题解决方法

1. 解决Entry可编辑/设置state="readonly"后消失的问题

Tkinter的Entry组件设置state="readonly"后无法直接插入内容,必须先插入文本再设置只读状态。如果先设只读再执行insert,内容不会被渲染,视觉上就像“单元格消失”。所有单元格都遵循这个逻辑:创建组件→插入内容→设置只读。

2. 添加首行星期、首列时段的实现

将原有课程表区域整体下移1行、右移1列,用Label组件填充首行和首列(标题无需编辑,用Label更合适):

  • 首行(row=0):循环创建星期标签,对应column从1到5(假设Schedule.days是["周一","周二","周三","周四","周五"])
  • 首列(column=0):循环创建时段标签,对应row从1到9(对应9:00到17:00的9个时段)
  • 原有课程单元格的grid参数调整为row=i+1、column=col_index+1,给标题区域留出位置

修正后的完整代码

from tkinter import Tk, Entry, Label

# 假设Schedule类和Course类定义如下(可根据实际情况调整)
class Schedule:
    days = ["周一", "周二", "周三", "周四", "周五"]

class Course:
    def __init__(self, day, start_time, end_time, name):
        self.day = day
        self.start_time = start_time
        self.end_time = end_time
        self.name = name

class CourseTable:
    def __init__(self):
        # 示例课程数据,替换为实际数据
        self.courses = [
            Course("周一", 9, 11, "高等数学"),
            Course("周三", 14, 16, "大学英语"),
            Course("周五", 10, 12, "计算机基础")
        ]

    def print_table(self, root):
        # 初始化时段数组:5个工作日,每个对应9个时段(0-8对应9:00到17:00)
        week = [[0,1,2,3,4,5,6,7,8] for _ in range(5)]

        # 绘制首行星期标题
        for col_idx, day in enumerate(Schedule.days):
            day_label = Label(root, text=day, width=20, font=('Arial',12,'bold'))
            day_label.grid(row=0, column=col_idx+1, padx=2, pady=2)

        # 绘制首列时段标题
        for hour_idx in range(9):
            time_str = f"{9+hour_idx}:00"
            time_label = Label(root, text=time_str, width=10, font=('Arial',12))
            time_label.grid(row=hour_idx+1, column=0, padx=2, pady=2)

        # 填充课程单元格
        for course in self.courses:
            col_idx = Schedule.days.index(course.day)
            # 遍历课程覆盖的每个时段
            for i in range(course.start_time -9, course.end_time -9):
                entry = Entry(root, width=20, fg='#181a1f', font=('Arial',12))
                entry.grid(row=i+1, column=col_idx+1, padx=2, pady=2)
                entry.insert('end', course.name)
                entry.config(state='readonly')  # 先插入内容再设只读
                week[col_idx].remove(i)

        # 填充空单元格
        for col_idx in range(5):
            for hour in week[col_idx]:
                entry = Entry(root, width=20, fg='#181a1f', font=('Arial',12))
                entry.grid(row=hour+1, column=col_idx+1, padx=2, pady=2)
                entry.insert('end', "")
                entry.config(state='readonly')

if __name__ == "__main__":
    root = Tk()
    root.title("周课程表")
    schedule = CourseTable()
    schedule.print_table(root)
    root.mainloop()

关键修改说明

  • 只读状态顺序:所有Entry先执行insert再设置state='readonly',确保内容正常显示且不可编辑
  • 行列偏移:原有课程单元格的row和column均加1,为标题区域腾出空间
  • 标题组件选择:首行星期和首列时段使用Label,避免编辑功能,样式更贴合标题需求
  • 数组索引同步:week数组的操作同步偏移后的行列,保证空单元格填充位置正确

内容的提问来源于stack exchange,提问作者4DescarTes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:05:41