访问添加到Tkinter根对象的对象
假设我有以下代码:
root = Tk()
open = Button(self.root, text='Open', command=self.open, state='disabled')
open.pack()
close = Button(self.root, text='Close', command=self.close, state='disabled')
close.pack()
我只想在某个操作发生时启用按钮,所以我需要在之后再次访问这些按钮,以便修改它们的状态变量。与其把按钮放到一个单独的列表里去存储,不如说有没有办法通过调用根对象的方法来访问这些按钮,或者说我附加在根对象上的任何一组对象(比如菜单、下拉列表等等)呢?
3 个回答
0
这些会在根节点的子字典里,不过它们的键是一个长整型数字(我认为是C层面指针的值)。为了让内容更易读,字典的值中添加了换行符。
> >>> from Tkinter import Tk, Button
> >>> root=Tk()
> >>> open=Button(root, text='Open')
> >>> root.__dict__
> {'_tclCommands': ['tkerror', 'exit', '3077241668Ldestroy'],
> 'master': None,
> 'children': {'3077328108L': <Tkinter.Button instance at 0xb76c4cec\>},
> '_tkloaded': 1,
> 'tk': <tkapp object at 0xb76bd560\>}
1
因为你正在使用pack方法,所以可以用pack_slaves方法来找到已经添加的项目。要遍历这些项目,你可以这样做:
for item in root.pack_slaves():
item.do_stuff()
1
没有一种确定的方法可以从根窗口获取所有小部件的列表。你可以使用 pack_slaves
或 grid_slaves
来获取某个特定容器管理的小部件列表,但这并不能保证你能得到所有的小部件,这取决于你编写应用程序的方式。
你还可以使用 winfo_children
来获取某个小部件的所有直接子小部件的列表。如果你有一个嵌套的小部件层级(比如使用框架作为中介容器来组织小部件),你可能需要进行一些循环操作来找到特定的小部件。
最简单也最好的方法是让你的应用程序成为一个类的实例。这样你就可以把小部件的引用保存为这个类的属性。我强烈推荐这种方法,真的没有理由去用其他方式。
例如:
class MyApp(Tk):
def __init__(self, *args, **kwargs):
...
self.open_button = Button(...)
self.close_button = Button(...)
...
def OnSomeEvent(self, event):
if ...:
self.open_button.configure(state="disabled")
else:
self.open_button.configure(state="normal")