2016-06-18 58 views
2

我有一個要做的任務列表。該列表有幾個子組,我想一起顯示。爲此,我爲每個子組創建了一個框架,並使用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,等等,但我不覺得這是優雅的。

回答

3

如果Tkinter不包含子窗口小部件,它將不會調整它的大小。所以,如果你有一個回調,一次刪除所有的標籤幀根本不會調整。一個簡單的(如果有點瘋狂的)解決方法是將一個虛擬的Frame小部件添加到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() 
+0

與lambda函數很好的把戲。我在lambda函數中從未見過默認參數。我使用partial()代替。 – Florent

+0

@Florent:這是一個非常標準的技巧,它比使用「partial」更高效。它的工作原理是因爲args的默認值是在創建函數時設置的(無論是「def」還是「lambda」)。 –

相關問題