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

时间:2011-07-29 22:46:20

标签: python 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()

我只想在执行某些操作时启用按钮,因此我需要稍后再次访问按钮以编辑状态变量。有没有一种方法可以访问按钮,或者就此而言,我已经附加到根目录的任何对象集(菜单,下拉列表或其他),而不是将按钮添加到单独的列表并存储它们,通过调用root上的方法?

3 个答案:

答案 0 :(得分:1)

由于您使用的是pack方法,因此可以使用pack_slaves方法查找添加的项目。因此,为了迭代它们,你可以做类似的事情,

for item in root.pack_slaves():
    item.do_stuff()

答案 1 :(得分: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")

答案 2 :(得分:0)

这些将在root的子词典中,但是使用long int(我相信C层中指针的值)作为键。 (为了便于阅读,在dict值中添加了换行符)

>  >>> 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\>}