Как вызвать кнопки меню в tkinter с примененной моделью mvc? - PullRequest
0 голосов
/ 08 мая 2020

Я долго искал, но документация мне не очень помогает.

В основном мне нужно проверить, какая кнопка была нажата в меню файла. Я создаю приложение впервые. Так что для меня все в новинку.

Я понимаю, что этот фрагмент кода возвращает событие, но я не могу получить никакой информации о кнопке / виджете, которая была нажата из этого события: self.view.menubar.filemenucascade.bind("<<MenuSelect>>",self.menuActions)

Я пытался получить его с помощью event.widget.keys(), а затем event.widgets.cget("title"), но заголовок остался пустым. Я также не смог дать командам заголовок, чтобы не сделать его пустым.

Мне не нужна команда в строках add_command(label="Load Settings"), потому что это не MVC Думаю. То, что делает кнопка, должно быть в контроллере, насколько я понимаю.

Код на данный момент:

import tkinter as tk


# Data and datamutation of the app 
class Model():

    def __init__(self):
        pass

# GUI
class View():

    def __init__(self, master):
        self.master = master

        # Load menu bar
        self.menubar = MenuBar(self.master)
        self.menubar.configure(bg="#ff0000") 
        self.menubar.pack(side=tk.TOP,fill=tk.X)

        # load main frame
        self.fileselector = FileSelector(self.master)
        self.fileselector.configure(bg="#00ff00")
        self.fileselector.pack(fill=tk.BOTH, expand=1)

        #load status bar
        self.statusbar = StatusBar(self.master)
        self.statusbar.configure(bg="#0000ff", relief="sunken", bd=1)
        self.statusbar.pack(side=tk.BOTTOM, fill=tk.X)


class MenuBar(tk.Frame):

    def __init__(self, master):
        super().__init__()
        self.master = master

        # Start file menu
        self.filemenu = tk.Menubutton(self, text="File", relief="flat",bd=1,activebackground="#dddddd")
        self.filemenucascade = tk.Menu(self.filemenu, tearoff=0)
        self.filemenucascade.add_command(label="Load Settings")
        self.filemenucascade.add_command(label="Save Settings")
        self.filemenucascade.add_separator()
        self.filemenucascade.add_command(label="Exit")
        self.filemenu.configure(menu=self.filemenucascade)
        self.filemenu.pack(side=tk.LEFT)

        # Start edit menu

        # Start help menu


class FileSelector(tk.Frame):
    def __init__(self, master):
        super().__init__()
        self.master = master


class StatusBar(tk.Frame):
    def __init__(self, master):
        super().__init__()
        self.master = master
        self.label = tk.Label(self, text="Some status")
        self.label.pack(side=tk.LEFT)


# Controller
class Controller():

    def __init__(self):
        self.root = tk.Tk()
        self.configRoot()
        self.model=Model()
        self.view=View(self.root)
        self.view.menubar.filemenucascade.bind("<<MenuSelect>>",self.menuActions)
        self.run()

    def configRoot(self):
        self.root.title("Ini file creator")
        self.root.geometry("500x500")
        self.root.deiconify()

    def run(self):
        self.root.mainloop()

    def showConfigFile(self,event):
        self.currentconfigfile = self.model.showConfigFile()
        self.view.filepicklabel["text"] = self.currentconfigfile

    def menuActions(self,event):
        print("How to get the button that was clicked?")
        #if exit is pressed, call self.exit()

    def exit(self,event):
        self.root.destroy()

if __name__ == '__main__':
    c = Controller()

Изменить: по запросу я добавил минимальный воспроизводимый пример, но это не OOP, поэтому, возможно, решения не будут работать в приведенном выше примере MVC:

import tkinter as tk

root = tk.Tk()

def menuActions(event):
    print("How to get the button that was clicked?")
    #if exit is pressed, call exit()

def exit(event):
    root.destroy()

# Start file menu
filemenu = tk.Menubutton(root, text="File", relief="flat",bd=1,activebackground="#dddddd")
filemenucascade = tk.Menu(filemenu, tearoff=0)
filemenucascade.add_command(label="Load Settings")
filemenucascade.add_command(label="Save Settings")
filemenucascade.add_separator()
filemenucascade.add_command(label="Exit")
filemenu.configure(menu=filemenucascade)
filemenu.pack(side=tk.LEFT)

filemenucascade.bind("<<MenuSelect>>",menuActions)

tk.mainloop()
...