BlackJack hat geschrieben:@Alfons Mittelmeyer: Der OP hat aber kein 500 Zeilen-Menü und selbst wenn man das hat, würde man auch nicht das Menü als ganzes auslagern, sondern eher anfangen das sinnvoll nach Funktionalität zu verteilen.
Am Anfang der Programmentwicklung stehen normalerweise die Anforderungen. Und dann kommen die Softwarearchitekten und gliedern das nach funktionellen Einheiten. Stefanxfg macht das also genau richtig.
Eine sinnvolle funktionelle Einheit ist sicher das Menü. Beim Menü darf man nicht nur die GUI Elemente rechnen, sondern auch dass diese eine Funktionalität haben. Menü GUI erweitert um Funktionalität ergibt etwa einen Faktor von fünf. Aus hundert Zeilen werden dann eben 500.
Hier mein Menü:
Code: Alles auswählen
import tkinter as tk
class Application(tk.Tk):
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
self.geometry('600x183+0+0')
self.mainmenu = Mainmenu(self)
self['menu'] = self.mainmenu
self.message = tk.Message(self,bg='white', text='Das soll der GuiDesigner sein.\n\nIm Original ist er allderdings in einem Toplevel Window,\ndamit man das Mainwindow designen kann.\n\nDas Menü hier aber ist original!', width=600)
self.message.pack(expand=1)
class Mainmenu(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.Menu = Menu_1(self,name='menu_1',activebackground='#7bfeff', bg='white', relief='solid', tearoff=0)
self.add_cascade(menu=self.Menu,label='File')
self.Menu_1 = Menu1(self,name='menu1',activebackground='#7bfeff', bg='white', relief='solid', tearoff=0)
self.add_cascade(menu=self.Menu_1,label='Special')
self.menu = Menu_2(self,name='menu_2',activebackground='#7bfeff', bg='white', relief='solid', tearoff=0)
self.add_cascade(menu=self.menu,label='Help')
self.add_command(background='green', columnbreak=1, label='Create ON')
self.add_command()
self.add_command(background='green', label='Config ON')
self.add_command()
self.add_command(background='green', label='Layout ON')
self.add_command()
self.add_command(background='green', label='Mouse ON')
self.add_command(label='Hide')
class Menu_1(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.add_command(label='Backup')
self.add_command(label='Save')
self.add_command(label='Load & Edit')
self.add_command(label='Load & Run')
self.Menu = Menu_3(self,name='menu_3',activebackground='#7bfeff', bg='white', relief='solid', tearoff=0)
self.add_cascade(menu=self.Menu,label='Split & Join')
self.add_separator()
self.Menu_1 = Menu1_1(self,name='menu1_1',activebackground='#7bfeff', bg='white', relief='solid', tearoff=0)
self.add_cascade(menu=self.Menu_1,label='Export (tk)')
self.Menu_2 = Menu2(self,name='menu2',activebackground='#7bfeff', bg='white', relief='solid', tearoff=0)
self.add_cascade(menu=self.Menu_2,label='Save Access')
self.add_separator()
self.add_command(label='Quit')
class Menu_3(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.add_command(label='Help')
self.add_separator()
self.add_command(label='Save (part)')
self.add_command(label='Load & Edit (part)')
self.add_command(label='Load & Run (part)')
class Menu1_1(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.add_command(label='Help')
self.add_separator()
self.add_command(label='with names')
self.add_command(label='without names')
class Menu2(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.add_command(label='Widget Depth')
self.add_command(label='Container Depth')
class Menu1(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.add_command(label='Toproot')
self.add_command(label='Refresh')
self.add_separator()
self.Menu = Menu_4(self,name='menu_4',activebackground='#7bfeff', bg='white', relief='solid', tearoff=0)
self.add_cascade(menu=self.Menu,label='Expert Options')
class Menu_4(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.add_command(label='Help')
self.add_separator()
self.add_command(label='Code')
class Menu_2(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.add_command(label='Introduction')
self.add_command(label='Config Options')
self.add_command(label='Tuple Entries')
self.add_command(label='Menu Entries')
self.add_command(label='Backup')
self.add_command(label='Save & Load')
self.add_command(label='Export (tk)')
self.add_command(label='Save Access')
self.add_separator()
self.menu = Menu_5(self,name='menu_5',activebackground='#7bfeff', bg='white', relief='solid', tearoff=0)
self.add_cascade(menu=self.menu,label='Programming')
self.menu_1 = Menu1_2(self,name='menu1_2',activebackground='#7bfeff', bg='white', relief='solid', tearoff=0)
self.add_cascade(menu=self.menu_1,label='Code in Scripts')
self.add_command(label='Examples')
class Menu_5(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.add_command(label='Load Scripts')
self.add_command(label='Access Widgets')
self.add_command(label='Access Toplevel')
class Menu1_2(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.add_command(label='Functions')
self.add_command(label='Namespace')
self.add_command(label='Imports')
self.add_command(label='DynTkImports')
self.add_command(label='Relative Access')
self.add_command(label='Root Access')
self.add_command(label='Place for Code')
self.add_command(label='DynAccess')
Application().mainloop()
Ich finde es sehr praktisch, wenn man so etwas auslagert. Denn man braucht für Änderungen nicht in einem großen Script zu suchen, sondern editiert einfach den betreffenden File. Ich verstehe nicht, was Dir daran nicht gefällt, wenn man so ein Menü einfach in einen anderen File kopiert und dann importiert
Gut das Menü hätte nicht dann nicht größer werden brauchen, wenn man Funktionen wie File Laden, nicht im Menü selbst behandelt, sondern auch auslagert.
Auch sollte ich natürlich nicht alle Menüs
menu nennen und dann eindeutige Namen für die Klassen generieren lassen.