可以操纵tkinter框架对象的特定子窗口小部件通过父级访问它们吗?

时间:2013-07-02 19:41:34

标签: python tkinter

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

看起来像:

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)

3 个答案:

答案 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()