Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как я могу динамически заполнить виджет параметров в tkinter в зависимости от выбора из раскрывающегося меню?

Автор вопроса: IordanouGiannisОтветов: 2

моя проблема заключается в следующем: у меня есть несколько файлов, и я сделал раскрывающееся меню с именами, следующее, что мне нужно, это меню параметров, которое можно изменить всякий раз, когда выбрано имя файла, чтобы показать некоторые данные из конкретного файла как вариант. Чтобы было ясно, мой вопрос касается только того, как изменить меню параметров, когда выбран выбор из раскрывающегося списка. Спасибо за любую помощь.

pythontkinter

Ответы

Ответ 1 · рейтинг 9 · Bryan Oakley

Виджет OptionMenu - это не что иное, как вспомогательный класс, который создает кнопку меню, связанную с меню. Вы можете попасть в это меню через атрибут "menu". Единственная хитрость заключается в том, чтобы знать, что должны делать пункты меню, что является не чем иным, как установкой значения связанной переменной.

Вот пример:

import Tkinter as tk

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.om_variable = tk.StringVar(self)

        b1 = tk.Button(self, text="Colors", width=8, command=self.use_colors)
        b2 = tk.Button(self, text="Sizes", width=8, command=self.use_sizes)

        self.om = tk.OptionMenu(self, self.om_variable, ())
        self.om.configure(width=20)
        self.use_colors()

        b1.pack(side="left")
        b2.pack(side="left")
        self.om.pack(side="left", fill="x", expand=True)


    def _reset_option_menu(self, options, index=None):
        '''reset the values in the option menu

        if index is given, set the value of the menu to
        the option at the given index
        '''
        menu = self.om["menu"]
        menu.delete(0, "end")
        for string in options:
            menu.add_command(label=string,
                             command=lambda value=string:
                                  self.om_variable.set(value))
        if index is not None:
            self.om_variable.set(options[index])

    def use_colors(self):
        '''Switch the option menu to display colors'''
        self._reset_option_menu(["red","orange","green","blue"], 0)

    def use_sizes(self):
        '''Switch the option menu to display sizes'''
        self._reset_option_menu(["x-small", "small", "medium", "large"], 0)

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

Ответ 2 · рейтинг -1 · Lino Bossio

Поскольку OptionMenu предоставляет параметр команды, я бы предложил сохранить ссылку на уже заданную команду (если она есть) и передать ее новым параметрам следующим образом:

посещаемость, переменные на основе предыдущего ответа

def __init__(self, *args, **kwargs):
    ...
    self.command=kwargs['command']
    ...

def _reset_option_menu(options, index=None):
    ...
    menu.add_command(label=string,
                     command=lambda:self.command(),
                     value=self.om_variable.set(string))
        ...

Надеюсь, это будет полезно, кстати, действительно полезен ответ, данный Брайаном Окли,

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы