如何将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
相关产品推荐
相关产品推荐

