我有一个窗口小部件表,它包含在一个框架内(在另一个框架内,但这并不重要)
看起来像:
self.myTable = Frame(self.pf) #self.pf is the frame which contains my table
Label(self.myTable, text='Amount').grid(row=0, column=0)
Label(self.myTable, text='Rate').grid(row=0, column=1)
Button(self.myTable, text='Delete').gri(row=0, column=2)
Button(self.myTable,)text='Editor').grid(row=0, column=3)
正如你可以看到框架(表格)中的一些小部件是标签,而其他小部件是按钮
有没有办法通过访问父级来操纵按钮对象? 例如:通过父
更改仅按钮的状态我知道这段代码不正确有几个原因,但它本质上是我要做的
self.myTable.CHILDRENTHATAREBUTTONS.config(state=DISABLED)
答案 0 :(得分:0)
请参阅winfo_children http://effbot.org/tkinterbook/widget.htm,它也会返回标签。您不保存对按钮的任何引用,我不知道是否有必要。下面的简单示例将每个按钮实例附加到列表中,这是一种直接的方法。
try:
import Tkinter as tk ## Python 2.x
except ImportError:
import tkinter as tk ## Python 3.x
def callback():
for but in button_list:
but.config(state=tk.DISABLED)
master=tk.Tk()
table = tk.Frame(master)
tk.Label(table, text='Amount').grid(row=0, column=0)
tk.Label(table, text='Rate').grid(row=0, column=1)
table.grid()
button_list = []
but=tk.Button(table, text='Delete', command=callback)
but.grid(row=0, column=2)
button_list.append(but)
but=tk.Button(table, text='Editor', command=callback)
but.grid(row=0, column=3)
button_list.append(but)
master.mainloop()
答案 1 :(得分:0)
您可以创建Frame对象的属性,该属性存储其子按钮的列表。
self.myTable = Frame(self.pf)
Label(self.myTable, text='Amount').grid(row=0, column=0)
Label(self.myTable, text='Rate').grid(row=0, column=1)
rmBtn = Button(self.myTable, text='Delete')
editBtn = Button(self.myTable, text='Editor')
rmBtn.grid(row=0, column=2)
editBtn.grid(row=0, column=3)
self.myTable.buttons = [rmBtn, editBtn]
然后,您可以通过循环属性来访问它们:
for btn in self.myTable.buttons:
btn.config(state=tk.DISABLED)
但是,不要滥用猴子补丁,创建一个你想要添加方法或属性的派生类总是更清晰。
class NFrame(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.buttons = []
答案 2 :(得分:0)
昨天我遇到了同样的问题 - 这是我的回答:
有一个名为winfo_children
的神奇函数(而不仅仅是children
)可以获取父窗口小部件的所有子元素。以下是两个例子:
root = tkinter.Tk()
EG1。
for child in root.winfo_children():
child.config(state="disable")
EG2。
frm = tkinter.Frame(root)
for child in frm.winfo_children():
child.destroy()