Я долго искал, но документация мне не очень помогает.
В основном мне нужно проверить, какая кнопка была нажата в меню файла. Я создаю приложение впервые. Так что для меня все в новинку.
Я понимаю, что этот фрагмент кода возвращает событие, но я не могу получить никакой информации о кнопке / виджете, которая была нажата из этого события: 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()