Как выбрать все экземпляры виджета в tkinter? - PullRequest
0 голосов
/ 24 сентября 2018

Так кто-нибудь знает способ «получить» все метки, например, из программы или окна в Tk.то есть как root.winfo.children, но только для типа виджета.

Также я знаю, что вы можете использовать списки, но я хочу знать, есть ли лучший способ?

1 Ответ

0 голосов
/ 24 сентября 2018

Вы можете использовать универсальный метод winfo_toplevel(), чтобы получить окно верхнего уровня, содержащее любой виджет, и понимание списка , чтобы отфильтровать класс элементов, возвращаемых winfo_children(), поэтому он содержит только виджетыжелаемый тип.Вот пример этого:

from pprint import pprint
import tkinter as tk


class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.grid()
        self.createWidgets()

    def createWidgets(self):
        self.quitButton = tk.Button(self, text='Test', command=self.find_buttons)
        self.quitButton.grid()
        nested_frame = tk.Frame(self)  # Nest some widgets an extra level for testing.
        self.quitButton = tk.Button(nested_frame, text='Quit', command=self.quit)
        self.quitButton.grid()
        nested_frame.grid()

    def find_buttons(self):
        WIDGET_CLASSNAME = 'Button'
        toplevel = self.winfo_toplevel()  # Get top-level window containing self.
        # Use a list comprehension to filter result.
        selection = [child for child in get_all_children(toplevel)
                        if child.winfo_class() == WIDGET_CLASSNAME]
        pprint(selection)


def get_all_children(widget):
    """ Return a list of all the children, if any, of a given widget.  """
    result = []  # Initialize.
    return _all_children(widget.winfo_children(), result)


def _all_children(children, result):
    """ Recursively append all children of a list of widgets to result. """
    for child in children:
        result.append(child)
        subchildren = child.winfo_children()
        if subchildren:
            _all_children(subchildren, result)

    return result


app = Application()
app.master.title('Sample application')
app.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...