[英]How to enable and disable Frame instead of individual widgets in Python Tkinter
我有一個應用程序,單擊單選按鈕后,必須在當前窗口中啟用所有小部件。 起初,當我開始我的申請, 我有兩個單選按鈕frame1
,我必須禁用所有其他部件(如按鈕,輸入),它被放置在frame2
,每當我點擊radio_button1
它所有的部件應該啟用。 在此代碼中,當我單擊radio_button1
,它將激活所有小部件。 我是否可以開發出更好的方法,以便禁用並啟用整個框架,而不是啟用和禁用每個單獨的小部件? 下面是我當前的代碼:
from tkinter import *
from tkinter import simpledialog
class Gui:
def __init__(self, parent, **kw):
self.parent = parent
self.top = Toplevel(self.parent)
self.frame1= Frame(self.top,width= 450,height =550)
self.frame1.grid(row=0)
self.frame2 = Frame(self.top, width=450, height=550)
self.frame2.grid(row=1)
self.radio1=Radiobutton(self.frame1,text='radio_button1',value=1,command=self.enable_window)
self.radio2=Radiobutton(self.frame1,text='radio_button2',value=2)
self.label1 = Label(self.frame2, text='Label1:', width=15, background='white', justify=CENTER,
font='-weight bold')
self.label2 = Label(self.frame2, text='Lable2:', width=15, background='white', justify=CENTER,
font='-weight bold')
self.b=Button(self.frame2,text='save',state=DISABLED)
self.c = Button(self.frame2, text='cancel',state=DISABLED)
self.radio1.grid(row=0,column=0,sticky='W')
self.radio2.grid(row=0,column=1,padx=50,sticky='W')
self.label1.grid(padx=10, pady=5, row=0, column=0, sticky='E')
self.label2.grid(padx=10, pady=5, row=1, column=0, sticky='E')
self.b.grid(row=3,column=0)
self.c.grid(row=3, column=1)
self.entry1_Var = StringVar()
self.entry2_Var = StringVar()
self.entry1 = Entry(self.frame2, width=15, background='white', textvariable=self.entry1_Var,state='disable',
font='-weight bold')
self.entry2 = Entry(self.frame2, width=15, background='white', textvariable=self.entry2_Var,state='disable',
font='-weight bold')
self.entry1.grid(padx=10, pady=5, row=0, column=1, sticky='W')
self.entry2.grid(padx=10, pady=5, row=1, column=1, sticky='W')
self.entry_focus_flag = False
self.top.grab_set()
def enable_window(self):
self.entry1['state'] = 'normal'
self.entry2['state'] = 'normal'
self.b['state'] = NORMAL
self.b['state'] = NORMAL
class main_window:
def __init__(self,root):
self.root=root
button1=Button(self.root,text='Start application',command= lambda p=self.root:self.callback(p))
button1.pack()
def callback(self,p):
Gui(p)
root =Tk()
app = main_window(root)
root.mainloop()
您應該做的是遞歸地訪問框架的所有子項(及其子項等等,如果您(例如我)使用嵌套框架來組織UI),則分別禁用或啟用每個子項。
最好的方法是將ttk.Frame子類化以包含所需的功能:
class dFrame(ttk.Frame):
def enable(self, state='!disabled'):
def cstate(widget):
# Is this widget a container?
if widget.winfo_children:
# It's a container, so iterate through its children
for w in widget.winfo_children():
# change its state
w.state((state,))
# and then recurse to process ITS children
cstate(w)
cstate(self)
def disable(self):
self.enable('disabled')
然后將您的框架創建為dFrame的實例:
self.frame1 = dFrame(self.top,width= 450,height =550)
您可以使用:
self.frame1.enable()
和
self.frame1.disable()
啟用/禁用框架中的所有小部件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.