我想在tkinter中创建一个带有两个Frame的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。
答案 0 :(得分:9)
不确定它有多优雅,但我通过添加
找到了解决方案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()
答案 1 :(得分:1)
基于@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)
答案 2 :(得分:0)
我认为您可以一次隐藏整个框架。 如果使用网格
frame2.grid_forget()
如果使用了包装
frame2.pack_forget()
在您的情况下,功能应该是
def disable():
frame2.pack_forget()
要再次启用
def enable():
frame2.pack()
grid_forget()
或pack_forget()
可用于几乎所有tkinter小部件
这是一种简单的方法,可以减少代码的长度,我敢肯定它可以工作