我有一系列要完成的任务。该列表有几个子组,我想一起显示。为此,我为每个子组创建了一个框架,并使用grid()显示相应框架中的每个任务。任务完成后,我会销毁相应的标签。
当一个子组从一开始就是空的时候,tkinter会将帧的大小减小到0,而我却看不到它。但是当一个具有任务的子组变空时,它似乎具有最小尺寸并且不会消失。有没有办法防止这种情况?
以下是我的问题的一个例子:frame0没有出现,因为它是空的(这很好)。但即使在破坏了frame1的标签(带按钮)之后,frame1仍然出于某种原因保留了一行。
import tkinter as tk
window=tk.Tk()
frame0=tk.Frame(window,bg='green')
frame1=tk.Frame(window,bg='red')
frame2=tk.Frame(window,bg='blue')
window.grid_columnconfigure(0,weight=1)
frame0.grid(sticky='ew')
frame1.grid(sticky='ew')
frame2.grid(sticky='ew')
labelList1=[]
for i in range(2):
labelList1.append(tk.Label(frame1,text='Task type 1'))
labelList1[-1].grid(sticky='ew',pady=5)
tk.Label(frame2,text='Task type 2: 1').grid(sticky='ew',pady=5)
tk.Label(frame2,text='Task type 2: 2').grid(sticky='ew',pady=5)
for i in range(2):
tk.Button(window,text='Destroy {}'.format(i),command=labelList1[i].destroy).grid()
window.mainloop()
我找到了一种解决方法,只使用一个框架,使用第1到第100行为子组0,101到200到子组1,等等。但我不会发现这个优雅。
答案 0 :(得分:3)
如果没有子窗口小部件,Tkinter将不会调整帧的大小。因此,如果您有一个回调,一次删除所有标签,框架根本不会调整大小。一个简单的(如果有点kludgy)解决方法是将虚拟框架窗口小部件添加到frame1
。例如,添加此行
tk.Frame(frame1).grid()
在labelList1
循环之前。
FWIW,这是代码的变体,它会破坏标签和相应的按钮。
import tkinter as tk
window=tk.Tk()
frame0=tk.Frame(window,bg='green')
frame1=tk.Frame(window,bg='red')
frame2=tk.Frame(window,bg='blue')
window.grid_columnconfigure(0,weight=1)
frame0.grid(sticky='ew')
frame1.grid(sticky='ew')
frame2.grid(sticky='ew')
tk.Frame(frame1).grid()
num_tasks = 3
labelList1=[]
for i in range(num_tasks):
labelList1.append(tk.Label(frame1,text='Task type 1: {}'.format(i)))
labelList1[-1].grid(sticky='ew',pady=5)
tk.Label(frame2,text='Task type 2: 1').grid(sticky='ew',pady=5)
tk.Label(frame2,text='Task type 2: 2').grid(sticky='ew',pady=5)
def kill_label_and_button(l, b):
l.destroy()
b.destroy()
for i in range(num_tasks):
b = tk.Button(window,text='Destroy {}'.format(i))
b.config(command=lambda l=labelList1[i], b=b: kill_label_and_button(l, b))
b.grid()
window.mainloop()