Python 3.7 tkinter 8 - изменить пункт меню «команда» на лету - PullRequest
0 голосов
/ 10 ноября 2019

Я создаю приложение tkinter и пытаюсь реализовать шаблон контроллера представления модели.

У меня есть класс View:

class View(Frame):
    def __init__(self, master):
        """ Set up and display the user interface """
        Frame.__init__(self, master)
        self.menubar = Menu(master)
        self.menubar.add_command(label="Login")
        self.menubar.add_command(label="Register")
        self.menubar.add_command(label="Exit", command=master.quit)
        self.master = master
        self.master.config(menu=self.menubar)

, и в моем контроллере я хотел бы установитьопция 'command' для элемента меню 'Login' выглядит так (потому что я не хочу, чтобы мой просмотр обрабатывал логику входа в систему):

class Controller:
    def __init__(self):
        self.root = Tk()
        self.model = Model()
        self.view = View(self.root)

---> self.view.menubar [set command for 'login 'item = self.test ()] <- здесь я пытаюсь понять синтаксис. Документация по Tkinter не очень полезна, и большинство сообщений в блогах предлагают очень упрощенные примеры. Я пробовал что-то вроде: <code>self.view.menubar.entryconfigure(0, command=self.test) но не повезло.

    def run(self):
        self.root.title("Password Manager Application")
        self.root.mainloop()

    def test(self):
        print("Asdf")

Спасибо за помощь, Марк

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Правильное решение - использовать itemconfigure. Тем не менее, нулевой элемент не может быть тем, что вы думаете. Если вы не установите tearoff на False, нулевой элемент может быть элементом отрыва.

Вы можете использовать метку элемента вместо номера для индекса, что гарантирует изменение правильного элемента (при условии, что метка не меняется).

Пример:

self.view.menubar.entryconfigure("Login", command=self.test)
0 голосов
/ 11 ноября 2019

Обновление: вы можете попытаться использовать entryconfig(1, command=new_cmd)

Альтернативный подход, который вы можете сделать, - это внести эти изменения в командную функцию и поместить его в код контроллера.

Пример

def login_cmd(self):
    if self.login_cmd_option == 'A':
        self.login_A()
    else:
        self.login_B()

def set_login_cmd(login_cmd_option):
    self.login_cmd_option = login_cmd_option
...