Tkinter开发eTasks GUI时Frame未显示问题求助
解决eTasks GUI中Frame不显示的问题并添加三个任务文件夹Frame
我看了你代码里的问题啦,主要是taskframe没显示的核心原因是你用了pack_propagate(False)但没给它设置具体尺寸,而且pack的时候没加expand=True,导致它没有足够的空间渲染出来。另外你要添加三个任务文件夹的Frame,咱们一步步来修复:
第一步:修复taskframe的显示问题
原代码里的taskframe.pack(fill=BOTH)加上expand=True,同时可以去掉pack_propagate(False)(除非你明确要固定Frame大小,不然让它根据子组件自适应更灵活)。如果非要保留pack_propagate(False),那必须给taskframe设置width和height参数,比如taskframe=tk.Frame(..., width=800, height=600)。
第二步:添加三个任务文件夹Frame
在修复后的taskframe里,我们可以用grid布局来均分空间,让三个Frame横向排列,每个Frame设置不同的背景色区分,加上标题标签方便识别。
下面是修改后的完整代码,我标注了关键修改点:
import tkinter as tk from tkinter import ttk from time import strftime from datetime import date todohome=tk.Tk() todohome.geometry('500x500+100+100') todohome.attributes('-fullscreen', True) todohome.overrideredirect(True) todohome.configure(bg='white') # 顶部控制栏Frame ctrlfrme=tk.Frame(todohome, relief='groove', highlightbackground='black', highlightthickness=1) ctrlfrme.pack(anchor='n', side=tk.TOP, fill=tk.X) Clsewindowbutton=ttk.Button(ctrlfrme, text='X', command=todohome.destroy, width=10) Clsewindowbutton.pack(side=tk.LEFT, anchor=tk.NE) def minimise(): todohome.overrideredirect(False) todohome.state(newstate='iconic') MinButton=ttk.Button(ctrlfrme, text='-', width=10, command=minimise) MinButton.pack(side=tk.RIGHT, anchor=tk.SW) # 快速栏Frame quickbar=tk.Frame(todohome, relief="groove", highlightbackground="black", highlightthickness=1) quickbar.pack(anchor='n', side=tk.TOP, pady=5, fill=tk.X) # 加fill=X让它铺满窗口宽度 Welcome=tk.Label(quickbar, font=('calibri', 20), text="Welcome to eTasks") Welcome.pack(side=tk.LEFT, anchor="w") def time(): ctime=strftime('Time: %H:%M:%S') clock.config(text=ctime) clock.after(1000, time) clock=tk.Label(quickbar, font=('calibri', 20), foreground='black') clock.pack(anchor='n', side=tk.RIGHT, padx=20) def getdate(): today = date.today() cdate = today.strftime("%d/%m/%Y") datecal=tk.Label(quickbar, font=('calibri', 20), foreground='black', text=cdate) datecal.pack(anchor='n', side=tk.LEFT, padx=100) # 修复后的任务主Frame taskframe=tk.Frame(todohome, relief="groove", highlightbackground="black", highlightthickness=1, bg='red') # 去掉pack_propagate(False),让它根据子组件自适应;若要固定大小可保留并添加width/height # taskframe.pack_propagate(False) taskframe.pack(fill=tk.BOTH, expand=True) # 关键:加expand=True让它占满剩余窗口空间 # 添加三个任务文件夹Frame,用grid布局均分空间 taskframe.grid_columnconfigure((0,1,2), weight=1) # 三列均分宽度 taskframe.grid_rowconfigure(0, weight=1) # 一行占满高度 # 第一个任务文件夹:待办任务 folder1 = tk.Frame(taskframe, bg='lightblue', relief='ridge', highlightthickness=1) folder1.grid(row=0, column=0, padx=5, pady=5, sticky='nsew') tk.Label(folder1, text="待办任务", font=('calibri',16)).pack(pady=10) # 第二个任务文件夹:进行中任务 folder2 = tk.Frame(taskframe, bg='lightgreen', relief='ridge', highlightthickness=1) folder2.grid(row=0, column=1, padx=5, pady=5, sticky='nsew') tk.Label(folder2, text="进行中任务", font=('calibri',16)).pack(pady=10) # 第三个任务文件夹:已完成任务 folder3 = tk.Frame(taskframe, bg='lightcoral', relief='ridge', highlightthickness=1) folder3.grid(row=0, column=2, padx=5, pady=5, sticky='nsew') tk.Label(folder3, text="已完成任务", font=('calibri',16)).pack(pady=10) getdate() time() todohome.mainloop()
关键修改说明:
- 给
taskframe.pack()加上expand=True,让它能填充窗口的剩余空间(这是原Frame不显示的核心修复点) - 去掉
pack_propagate(False),如果需要固定taskframe大小,可保留并添加width和height参数 - 给
quickbar加上fill=tk.X,让它铺满窗口宽度,布局更美观 - 用
grid布局在taskframe里创建了三个均分空间的任务文件夹Frame,每个Frame设置sticky='nsew'来填充分配到的空间 - 每个任务Frame添加了标题标签,方便区分不同的任务文件夹
这样修改后,三个任务文件夹Frame就能正常显示啦,你可以根据自己的需求调整每个Frame的样式和内容~
内容的提问来源于stack exchange,提问作者Minion123
相关产品推荐
相关产品推荐

