Доступ к объектам, добавленным в корень Tkinter - PullRequest
2 голосов
/ 30 июля 2011

Допустим, у меня есть следующий код:

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 ]

1 голос
/ 30 июля 2011

Поскольку вы используете метод pack, вы можете использовать метод pack_slaves, чтобы найти добавленные элементы.Таким образом, для их перебора вы можете сделать что-то вроде

for item in root.pack_slaves():
    item.do_stuff()
1 голос
/ 30 июля 2011

Нет точного способа запросить в корневом окне список всех виджетов. Вы можете использовать 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")
0 голосов
/ 30 июля 2011

Они будут в дочернем словаре root, но с длинным 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\>}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...