Как я могу динамически заполнить виджет опций в tkinter в зависимости от выбора из выпадающего меню? - PullRequest
2 голосов
/ 13 сентября 2011

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

Ответы [ 2 ]

9 голосов
/ 13 сентября 2011

Виджет 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()
0 голосов
/ 19 декабря 2014

Поскольку 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))                         
        ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...