2014-07-24 64 views
3

我想在兩個框架的tkinter中創建一個圖形用戶界面,並將底部框架變成灰色,直到發生某些事件。有沒有辦法灰化(禁用)tkinter框架?

下面是一些示例代碼:無需逐個灰掉所有的幀2的小部件的

from tkinter import * 
from tkinter import ttk 

def enable(): 
    frame2.state(statespec='enabled') #Causes error 

root = Tk() 

#Creates top frame 
frame1 = ttk.LabelFrame(root, padding=(10,10,10,10)) 
frame1.grid(column=0, row=0, padx=10, pady=10) 

button2 = ttk.Button(frame1, text="This enables bottom frame", command=enable) 
button2.pack() 

#Creates bottom frame 
frame2 = ttk.LabelFrame(root, padding=(10,10,10,10)) 
frame2.grid(column=0, row=1, padx=10, pady=10) 
frame2.state(statespec='disabled') #Causes error 

entry = ttk.Entry(frame2) 
entry.pack() 

button2 = ttk.Button(frame2, text="button") 
button2.pack() 

root.mainloop() 

這可能嗎?

我正在使用Tkinter 8.5和Python 3.3。

回答

5

不知道它是多麼優雅,但我找到了解決方案通過增加

for child in frame2.winfo_children(): 
    child.configure(state='disable') 

它遍歷並禁止每個幀2的兒童,並通過改變enable()與基本扭轉這種

def enable(childList): 
    for child in childList: 
     child.configure(state='enable') 

此外,我刪除frame2.state(statespec='disabled'),因爲這不會做我所需要的,並拋出一個錯誤。

下面是完整的代碼:如果你描述你做了什麼

from tkinter import * 
from tkinter import ttk 

def enable(childList): 
    for child in childList: 
     child.configure(state='enable') 

root = Tk() 

#Creates top frame 
frame1 = ttk.LabelFrame(root, padding=(10,10,10,10)) 
frame1.grid(column=0, row=0, padx=10, pady=10) 

button2 = ttk.Button(frame1, text="This enables bottom frame", 
        command=lambda: enable(frame2.winfo_children())) 
button2.pack() 

#Creates bottom frame 
frame2 = ttk.LabelFrame(root, padding=(10,10,10,10)) 
frame2.grid(column=0, row=1, padx=10, pady=10) 

entry = ttk.Entry(frame2) 
entry.pack() 

button2 = ttk.Button(frame2, text="button") 
button2.pack() 

for child in frame2.winfo_children(): 
    child.configure(state='disable') 

root.mainloop() 
+0

你的回答會更好。否則,我們必須逐行閱讀,尋找差異。 –

+0

@BryanOakley公平點。我的答案現在更新以使其更清楚。 –

+3

我必須將'state ='enable''改爲'state ='normal''才能使其工作。 – JPaget

相關問題