访问添加到Tkinter根对象的对象

2 投票
3 回答
3795 浏览
提问于 2025-04-16 22:33

假设我有以下代码:

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_slavesgrid_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")

撰写回答