我想用两个框架在tkinter中创建一个GUI,并让底部的框架变灰,直到发生某些事件。
下面是一些示例代码:
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()
是否有可能不必单独将所有frame2的小部件变灰?
我正在使用Tkinter 8.5和Python 3.3。
不知道它有多优雅,但是我通过添加找到了解决方案
for child in frame2.winfo_children():
child.configure(state='disable')
循环并禁用每个frame2的子代,并通过更改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()
基于@big Sharpie解决方案,这里有2个通用功能,可以禁用和启用小部件的层次结构(“包含”框架)。框架不支持状态设置器。
def disableChildren(parent):
for child in parent.winfo_children():
wtype = child.winfo_class()
if wtype not in ('Frame','Labelframe'):
child.configure(state='disable')
else:
disableChildren(child)
def enableChildren(parent):
for child in parent.winfo_children():
wtype = child.winfo_class()
print (wtype)
if wtype not in ('Frame','Labelframe'):
child.configure(state='normal')
else:
enableChildren(child)