假设我有以下代码:
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上的方法?
答案 0 :(得分:1)
由于您使用的是pack方法,因此可以使用pack_slaves方法查找添加的项目。因此,为了迭代它们,你可以做类似的事情,
for item in root.pack_slaves():
item.do_stuff()
答案 1 :(得分: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")
答案 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\>}