0

我有一个小部件表,它包含在一个框架内(在另一个框架内,但这并不重要)

看起来像:

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)

4

3 回答 3

1

请参阅 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()
于 2013-07-02T19:55:27.633 回答
1

我昨天也遇到了同样的问题——这是我的答案:

有一个称为winfo_children(而不是简单地children)的魔术函数,它可以获取父窗口小部件的所有子窗口。这里有两个例子:

root = tkinter.Tk()

例如1。

for child in root.winfo_children():
    child.config(state="disable")

例2。

frm = tkinter.Frame(root)
for child in frm.winfo_children():
    child.destroy()
于 2017-08-11T18:37:40.983 回答
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 = []
于 2015-09-04T23:01:02.797 回答