Ein-und Ausblenden Symbolleisten und Anordnen

Fragen zu Tkinter.
Antworten
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Hallo,

mein Problem besteht darin, dass ich Symbolleisten ausblenden möchte, wenn diese nicht angezeigt werden sollen. Das reine Ein- und Ausblenden stellt kein Problem dar. Ich steuere dies über Frames, welche mit Place gesetzt werden.
Vielleicht könnte eine Indezierung von Frames als Liste gemacht werden. Ich weiß nicht wie das geht. Aber dies ist unten schon anprogrammiert.

Code: Alles auswählen

class Main():
		self.symbolleisten = Menu(top, tearoff=0)
		self.optionen.add_cascade(menu=self.symbolleisten,
				activebackground="#d9d9d9",
				activeforeground="#000000",
				background="#d9d9d9",
				font="TkMenuFont",
				foreground="#000000",
				label="Symbolleisten")
		self.symbolleisten.add_checkbutton(
				variable=GUI_support.CheckA,
				activebackground="#d9d9d9",
				activeforeground="#000000",
				background="#d9d9d9",
				command=self.funcSymbolleisteA,
				font="TkMenuFont",
				foreground="#000000",
				label="Datenbank")
		self.symbolleisten.add_checkbutton(
				variable=GUI_support.CheckB,
				activebackground="#d9d9d9",
				activeforeground="#000000",
				background="#d9d9d9",
				command=self.funcSymbolleisteB,
				font="TkMenuFont",
				foreground="#000000",
				label="Analyse")
		self.symbolleisten.add_checkbutton(
				variable=GUI_support.CheckC,
				activebackground="#d9d9d9",
				activeforeground="#000000",
				background="#d9d9d9",
				command=self.funcSymbolleisteC,
				font="TkMenuFont",
				foreground="#000000",
				label="Auswertung")
		self.symbolleisten.add_checkbutton(
				variable=GUI_support.CheckD,
				activebackground="#d9d9d9",
				activeforeground="#000000",
				background="#d9d9d9",
				command=self.funcSymbolleisteD,
				font="TkMenuFont",
				foreground="#000000",
				label="Export")

Code: Alles auswählen

	def funcSymbolleisteA(self):
		if GUI_support.CheckA.get() == 1:
			#self.Frame11.place_forget()
			#self.Frame12.place_forget()
			#self.Frame13.place_forget()
			#self.Frame14.place_forget()
			self.Frame11.place(x=1*contentframewidth, y=0.0, height=45, width=contentframewidth)
			#self.Frame12.place(x=2*contentframewidth, y=0.0, height=45, width=contentframewidth)
			#self.Frame13.place(x=3*contentframewidth, y=0.0, height=45, width=contentframewidth)
			#self.Frame14.place(x=4*contentframewidth, y=0.0, height=45, width=contentframewidth)
		else:
			self.Frame11.place_forget()
			for i in range(1, 4):
				self.Frame12.place_forget()
				self.Frame13.place_forget()
				self.Frame14.place_forget()
				self.Frame12.place(x=i*contentframewidth, y=0.0, height=45, width=contentframewidth)
				self.Frame13.place(x=i*contentframewidth, y=0.0, height=45, width=contentframewidth)
				self.Frame14.place(x=i*contentframewidth, y=0.0, height=45, width=contentframewidth)
Viele Grüße Stefan
Zuletzt geändert von Anonymous am Freitag 28. April 2017, 13:45, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Hallo,

naja ich habe mir jetzt einen Weg einfallen lassen.

Code: Alles auswählen

	def funcSymbolleiste(self):
		z=1
		if GUI_support.CheckA.get() == 1:
			self.Frame11.place(x=z*contentframewidth, y=0.0, height=45, width=contentframewidth)
			z=z+1
		else:
			self.Frame11.place_forget()
		if GUI_support.CheckB.get() == 1:
			self.Frame12.place(x=z*contentframewidth, y=0.0, height=45, width=contentframewidth)
			z=z+1			
		else:
			self.Frame12.place_forget()			
		if GUI_support.CheckC.get() == 1:
			self.Frame13.place(x=z*contentframewidth, y=0.0, height=45, width=contentframewidth)
			z=z+1
		else:
			self.Frame13.place_forget()
		if GUI_support.CheckD.get() == 1:
			self.Frame14.place(x=z*contentframewidth, y=0.0, height=45, width=contentframewidth)
			z=z+1
		else:
			self.Frame14.place_forget()
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

stefanxfg hat geschrieben:naja ich habe mir jetzt einen Weg einfallen lassen.
Schon einmal daran gedacht, daß man:
- auch Parameter übergeben kann?
- ein Dictionary verwenden kann?
- ein grid Layout statt ein place Layout verwenden kann?

Code: Alles auswählen

    def funcSymbolleiste(self,name,check):

        leisten = {
            "Datenbank" : self.Frame11 ,
            "Analyse" : self.Frame12 ,
            "Auswertung" : self.Frame13 ,
            "Export" : self.Frame14}
        
        if check:
            leisten[name].grid()
        else:
            leisten[name].grid_remove()
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@stefanxfg: Kannst Du damit etwas anfangen?

Code: Alles auswählen

import tkinter as tk
from functools import partial

SYMBOL_FRAME_HEIGHT = 45
WINDOW_HEIGHT = 500

class AppMenu(tk.Menu):
    
    def __init__(self,master,funcSymbolleiste,**kwargs):
        tk.Menu.__init__(self,master,**kwargs)

        self.funcSymbolleiste = funcSymbolleiste

        # Initialisierung der Leisten
        self.leisten = {
            "Datenbank" : tk.IntVar() ,
            "Analyse" : tk.IntVar() ,
            "Auswertung" : tk.IntVar() ,
            "Export" : tk.IntVar() }
 
        self.blende_leiste('Datenbank',1)
        self.blende_leiste('Analyse',0)
        self.blende_leiste('Auswertung',0)
        self.blende_leiste('Export',1)

        # Menu GUI

        self.symbolleisten = tk.Menu(self, tearoff=0)

        self.add_cascade(menu=self.symbolleisten,
                activebackground="#d9d9d9",
                activeforeground="#000000",
                background="#d9d9d9",
                font="TkMenuFont",
                foreground="#000000",
                label="Symbolleisten")

        self.symbolleisten.add_checkbutton(
                activebackground="#d9d9d9",
                activeforeground="#000000",
                background="#d9d9d9",
                font="TkMenuFont",
                foreground="#000000",
                label="Datenbank",
                # Checkbutton Logik
                variable=self.leisten["Datenbank"],
                command=partial(self.blende_leiste,"Datenbank"))

        self.symbolleisten.add_checkbutton(
                activebackground="#d9d9d9",
                activeforeground="#000000",
                background="#d9d9d9",
                font="TkMenuFont",
                foreground="#000000",
                label="Analyse",
                # Checkbutton Logik
                variable=self.leisten["Analyse"],
                command=partial(self.blende_leiste,"Analyse"))

        self.symbolleisten.add_checkbutton(
                activebackground="#d9d9d9",
                activeforeground="#000000",
                background="#d9d9d9",
                font="TkMenuFont",
                foreground="#000000",
                label="Auswertung",
                # Checkbutton Logik
                variable=self.leisten["Auswertung"],
                command=partial(self.blende_leiste,"Auswertung"))

        self.symbolleisten.add_checkbutton(
                activebackground="#d9d9d9",
                activeforeground="#000000",
                background="#d9d9d9",
                font="TkMenuFont",
                foreground="#000000",
                label="Export",
                # Checkbutton Logik
                variable=self.leisten["Export"],
                command=partial(self.blende_leiste,"Export"))

    def blende_leiste(self,name,value=None):
        if value: # fuer Initialisierung der Symbolleisten
            self.leisten[name].set(value) # in Menue zeigen (check)
        self.funcSymbolleiste(name,self.leisten[name].get()) # Symbolleiste ein- oder ausblenden


class Application(tk.Tk):
    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)

        contentframewidth = 200       

        # Symbolleiste
        self.symbolleisten = tk.Frame(self)
        self.symbolleisten.grid(row=0,column=0,sticky='nw')

        # Inhalt (Frames) der Symbolleiste
        self.FrameFix = tk.LabelFrame(self.symbolleisten,text="Fix",width=contentframewidth)
        self.Frame11 = tk.LabelFrame(self.symbolleisten,text="Datenbank",width=contentframewidth)
        self.Frame12 = tk.LabelFrame(self.symbolleisten,text="Analyse",width=contentframewidth)
        self.Frame13 = tk.LabelFrame(self.symbolleisten,text="Auswertung",width=contentframewidth)
        self.Frame14 = tk.LabelFrame(self.symbolleisten,text="Export",width=contentframewidth)

        self.FrameFix.grid(row=0,column=0,sticky='ns')
        self.Frame11.grid(row=0,column=1,sticky='ns')
        self.Frame12.grid(row=0,column=2,sticky='ns')
        self.Frame13.grid(row=0,column=3,sticky='ns')
        self.Frame14.grid(row=0,column=4,sticky='ns')

        # Minimale Breite des Anwendungsfensters
        self.grid_columnconfigure(0,minsize = 5*contentframewidth,pad=0,weight=0)

        # Minimale Hoehe der Symbolleiste
        self.symbolleisten.grid_rowconfigure(0,minsize = SYMBOL_FRAME_HEIGHT,pad=0,weight=0)

        # Hoehe des Bereiches darunter im Falle von Positionierung durch place wie bisher
        # - was eigentlich nicht sein sollte - ansonsten minimale Hoehe des Bereiches darunter
        self.grid_rowconfigure(1,minsize = WINDOW_HEIGHT,pad=0,weight=0)

        # Hier kaeme die sonstige GUI

        # Am Ende das Menue
        self['menu'] = AppMenu(self,self.funcSymbolleiste)


    def funcSymbolleiste(self,name,check):

        leisten = {
            "Datenbank" : self.Frame11 ,
            "Analyse" : self.Frame12 ,
            "Auswertung" : self.Frame13 ,
            "Export" : self.Frame14}
        
        if check:
            leisten[name].grid()
        else:
            leisten[name].grid_remove()

Application().mainloop()
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@stefanxfg: Wenn Du im Menü default settings setzt, wie activeforground und so weiter, dann wird das auch von den Elementen im Menü geerbt. Also erübrigt sich das im Folgenden. Und außer activebackground waren es nur Defaultwerte.

Code: Alles auswählen

import tkinter as tk
from functools import partial

SYMBOL_FRAME_HEIGHT = 45
WINDOW_HEIGHT = 500

class AppMenu(tk.Menu):
    
    def __init__(self,master,funcSymbolleiste,**kwargs):
        tk.Menu.__init__(self,master,**kwargs)

        self.funcSymbolleiste = funcSymbolleiste

        # Initialisierung der Leisten
        self.leisten = {
            "Datenbank" : tk.IntVar() ,
            "Analyse" : tk.IntVar() ,
            "Auswertung" : tk.IntVar() ,
            "Export" : tk.IntVar() }
 
        self.blende_leiste('Datenbank',1)
        self.blende_leiste('Analyse',0)
        self.blende_leiste('Auswertung',0)
        self.blende_leiste('Export',1)

        # Menu GUI

        self.symbolleisten = tk.Menu(self, tearoff=0)

        self.add_cascade(
            menu=self.symbolleisten,
            label="Symbolleisten")

        self.symbolleisten.add_checkbutton(
                label="Datenbank",
                variable=self.leisten["Datenbank"],
                command=partial(self.blende_leiste,"Datenbank"))

        self.symbolleisten.add_checkbutton(
                label="Analyse",
                variable=self.leisten["Analyse"],
                command=partial(self.blende_leiste,"Analyse"))

        self.symbolleisten.add_checkbutton(
                label="Auswertung",
                variable=self.leisten["Auswertung"],
                command=partial(self.blende_leiste,"Auswertung"))

        self.symbolleisten.add_checkbutton(
                label="Export",
                variable=self.leisten["Export"],
                command=partial(self.blende_leiste,"Export"))

    def blende_leiste(self,name,value=None):
        if value: # fuer Initialisierung der Symbolleisten
            self.leisten[name].set(value) # in Menue zeigen (check)
        self.funcSymbolleiste(name,self.leisten[name].get()) # Symbolleiste ein- oder ausblenden


class Application(tk.Tk):
    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)

        contentframewidth = 200       

        # Symbolleiste
        self.symbolleisten = tk.Frame(self)
        self.symbolleisten.grid(row=0,column=0,sticky='nw')

        # Inhalt (Frames) der Symbolleiste
        self.FrameFix = tk.LabelFrame(self.symbolleisten,text="Fix",width=contentframewidth)
        self.Frame11 = tk.LabelFrame(self.symbolleisten,text="Datenbank",width=contentframewidth)
        self.Frame12 = tk.LabelFrame(self.symbolleisten,text="Analyse",width=contentframewidth)
        self.Frame13 = tk.LabelFrame(self.symbolleisten,text="Auswertung",width=contentframewidth)
        self.Frame14 = tk.LabelFrame(self.symbolleisten,text="Export",width=contentframewidth)

        self.FrameFix.grid(row=0,column=0,sticky='ns')
        self.Frame11.grid(row=0,column=1,sticky='ns')
        self.Frame12.grid(row=0,column=2,sticky='ns')
        self.Frame13.grid(row=0,column=3,sticky='ns')
        self.Frame14.grid(row=0,column=4,sticky='ns')

        # Minimale Breite des Anwendungsfensters
        self.grid_columnconfigure(0,minsize = 5*contentframewidth,pad=0,weight=0)

        # Minimale Hoehe der Symbolleiste
        self.symbolleisten.grid_rowconfigure(0,minsize = SYMBOL_FRAME_HEIGHT,pad=0,weight=0)

        # Hoehe des Bereiches darunter im Falle von Positionierung durch place wie bisher
        # - was eigentlich nicht sein sollte - ansonsten minimale Hoehe des Bereiches darunter
        self.grid_rowconfigure(1,minsize = WINDOW_HEIGHT,pad=0,weight=0)

        # Hier kaeme die sonstige GUI

        # Am Ende das Menue
        self['menu'] = AppMenu(self,self.funcSymbolleiste,activebackground="#d9d9d9")

    def funcSymbolleiste(self,name,check):

        leisten = {
            "Datenbank" : self.Frame11 ,
            "Analyse" : self.Frame12 ,
            "Auswertung" : self.Frame13 ,
            "Export" : self.Frame14}
        
        if check:
            leisten[name].grid()
        else:
            leisten[name].grid_remove()

Application().mainloop()
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@stefanxfg: ach so, für das submenü mußt Du auch noch den activebackground angeben:

Code: Alles auswählen

self.symbolleisten = tk.Menu(self, tearoff=0, activebackground = '#d9d9d9')
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@stefanxfg: jetzt ist es nochmals verkürzt. Das wäre es dann wohl ziemlich endgültig:

Code: Alles auswählen

import tkinter as tk
from functools import partial

SYMBOL_FRAME_HEIGHT = 45
WINDOW_HEIGHT = 500

class AppMenu(tk.Menu):
    
    def __init__(self,master,funcSymbolleiste,**kwargs):
        tk.Menu.__init__(self,master,**kwargs)

        self.funcSymbolleiste = funcSymbolleiste

        # Initialisierung der Leisten
        self.leisten = {
            "Datenbank" : tk.IntVar() ,
            "Analyse" : tk.IntVar() ,
            "Auswertung" : tk.IntVar() ,
            "Export" : tk.IntVar() }
 
        self.blende_leiste('Datenbank',1)
        self.blende_leiste('Analyse',0)
        self.blende_leiste('Auswertung',0)
        self.blende_leiste('Export',1)

        # Menu GUI
        self.symbolleisten = tk.Menu(self, tearoff=0, activebackground = '#d9d9d9')

        self.add_cascade(menu=self.symbolleisten,label="Symbolleisten")

        def options(name): return {
            'label'     : name,
            'variable'  : self.leisten[name],
            'command'   : partial(self.blende_leiste,name)}

        self.symbolleisten.add_checkbutton(**options('Datenbank'))
        self.symbolleisten.add_checkbutton(**options('Analyse'))
        self.symbolleisten.add_checkbutton(**options('Auswertung'))
        self.symbolleisten.add_checkbutton(**options('Export'))

    def blende_leiste(self,name,value=None):
        if value: # fuer Initialisierung der Symbolleisten
            self.leisten[name].set(value) # in Menue zeigen (check)
        self.funcSymbolleiste(name,self.leisten[name].get()) # Symbolleiste ein- oder ausblenden


class Application(tk.Tk):
    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)

        contentframewidth = 200       

        # Symbolleiste
        self.symbolleisten = tk.Frame(self)
        self.symbolleisten.grid(row=0,column=0,sticky='nw')

        # Inhalt (Frames) der Symbolleiste
        self.FrameFix = tk.LabelFrame(self.symbolleisten,text="Fix",width=contentframewidth)
        self.Frame11 = tk.LabelFrame(self.symbolleisten,text="Datenbank",width=contentframewidth)
        self.Frame12 = tk.LabelFrame(self.symbolleisten,text="Analyse",width=contentframewidth)
        self.Frame13 = tk.LabelFrame(self.symbolleisten,text="Auswertung",width=contentframewidth)
        self.Frame14 = tk.LabelFrame(self.symbolleisten,text="Export",width=contentframewidth)

        self.FrameFix.grid(row=0,column=0,sticky='ns')
        self.Frame11.grid(row=0,column=1,sticky='ns')
        self.Frame12.grid(row=0,column=2,sticky='ns')
        self.Frame13.grid(row=0,column=3,sticky='ns')
        self.Frame14.grid(row=0,column=4,sticky='ns')

        # Minimale Breite des Anwendungsfensters
        self.grid_columnconfigure(0,minsize = 5*contentframewidth,pad=0,weight=0)

        # Minimale Hoehe der Symbolleiste
        self.symbolleisten.grid_rowconfigure(0,minsize = SYMBOL_FRAME_HEIGHT,pad=0,weight=0)

        # Hoehe des Bereiches darunter im Falle von Positionierung durch place wie bisher
        # - was eigentlich nicht sein sollte - ansonsten minimale Hoehe des Bereiches darunter
        self.grid_rowconfigure(1,minsize = WINDOW_HEIGHT,pad=0,weight=0)

        # Hier kaeme die sonstige GUI

        # Am Ende das Menue
        self['menu'] = AppMenu(self,self.funcSymbolleiste,activebackground = '#d9d9d9')

    def funcSymbolleiste(self,name,check):

        leisten = {
            "Datenbank" : self.Frame11 ,
            "Analyse" : self.Frame12 ,
            "Auswertung" : self.Frame13 ,
            "Export" : self.Frame14}
        
        if check:
            leisten[name].grid()
        else:
            leisten[name].grid_remove()

Application().mainloop()
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@stefanxfg: ist das schon zu arg geschrumpf?

Code: Alles auswählen

import tkinter as tk
from functools import partial

CHECK_DEFAULTS = {'Datenbank': 1, 'Analyse' : 0, 'Auswertung' : 0, 'Export' : 1}
SYMBOL_FRAME_HEIGHT = 45
WINDOW_HEIGHT = 500

class AppMenu(tk.Menu):
    def __init__(self,master,funcSymbolleiste,**kwargs):
        tk.Menu.__init__(self,master,**kwargs)
        self.funcSymbolleiste = funcSymbolleiste

        # Menu GUI
        self.symbolleisten = tk.Menu(self, tearoff=0, activebackground = '#d9d9d9')

        self.add_cascade(menu=self.symbolleisten,label="Symbolleisten")

        # add Checkbuttons und checke sie. blende Symbolleisten ein oder aus
        self.leisten = {} # fuer checken
        def options(name): return {
            'label'     : name,
            'variable'  : self.leisten[name],
            'command'   : partial(self.blende_leiste,name)}

        for name,check in CHECK_DEFAULTS.items():
            self.leisten[name] = tk.IntVar()
            self.leisten[name].set(check)
            self.symbolleisten.add_checkbutton(**options(name))
            self.blende_leiste(name)

    def blende_leiste(self,name):
        self.funcSymbolleiste(name,self.leisten[name].get()) # Symbolleiste ein- oder ausblenden

class Application(tk.Tk):
    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)

        contentframewidth = 200       

        # Symbolleiste
        self.symbolleisten = tk.Frame(self)
        self.symbolleisten.grid(row=0,column=0,sticky='nw')

        # Inhalt (Frames) der Symbolleiste
        self.leisten = {} # fuer funcSymbolleiste
        def symframe(column,name):
            frame = tk.LabelFrame(self.symbolleisten,text=name,width=contentframewidth)
            frame.grid(row=0,column=column,sticky='ns')
            self.leisten[name] = frame # fuer funcSymbolleiste
            return frame

        self.FrameFix = symframe(0,'Fix')
        self.Frame11  = symframe(1,'Datenbank')
        self.Frame12  = symframe(2,'Analyse')
        self.Frame13  = symframe(3,'Auswertung')
        self.Frame14  = symframe(4,'Export')

        # Minimale Breite des Anwendungsfensters
        self.grid_columnconfigure(0,minsize = 5*contentframewidth,pad=0,weight=0)
        # Minimale Hoehe der Symbolleiste
        self.symbolleisten.grid_rowconfigure(0,minsize = SYMBOL_FRAME_HEIGHT,pad=0,weight=0)
        # Hoehe des Bereiches darunter im Falle von Positionierung durch place wie bisher
        # - was eigentlich nicht sein sollte - ansonsten minimale Hoehe des Bereiches darunter
        self.grid_rowconfigure(1,minsize = WINDOW_HEIGHT,pad=0,weight=0)

        # Hier kaeme die sonstige GUI

        # Am Ende das Menue
        self['menu'] = AppMenu(self,self.funcSymbolleiste,activebackground = '#d9d9d9')

    def funcSymbolleiste(self,name,check):
        self.leisten[name].grid() if check else self.leisten[name].grid_remove()
            
Application().mainloop()
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@stefanxfg: Fehler in der vorigen Version: CHECK_DEFAULTS darf kein dictionary sein, weil sonst alphabetisch sortiert wird, anstatt die Reihenfolge beizubehalten.

Nun berichtigt als Tupel von Tupeln. Außerdem mit allgemeiner Namensgebung, damit das Menü mit den Checkbuttons eine allgemeine Lösung ist.

Code: Alles auswählen

import tkinter as tk

# === Allgemeiner callback Aufruf fuer Menue Checkbuttons ==================================
CHECK_DEFAULTS = (('Datenbank', 1), ('Analyse', 0), ('Auswertung', 0), ('Export', 1))
CASCADE_LABEL = 'Symbolleisten'
MENU_ACTIVEBACKGROUND = '#d9d9d9' # identisch mit background, default: '#ececec'

class AppMenu(tk.Menu):
    def __init__(self,master,extern_callback,**kwargs):
        tk.Menu.__init__(self,master,**kwargs)

        # Menu GUI
        submenu = tk.Menu(self, tearoff=0, activebackground = MENU_ACTIVEBACKGROUND)
        self.add_cascade(menu=submenu,label=CASCADE_LABEL)

        # add Checkbuttons und checke sie. blende Symbolleisten ein oder aus
        checkvar_dictionary = {} # fuer checken
        def options(name): return {
            'label'     : name,
            'variable'  : checkvar_dictionary[name],
            'command'   : lambda name = name : extern_callback(name,checkvar_dictionary[name].get())}

        for entry in CHECK_DEFAULTS:
            name = entry[0]
            check = entry[1]
            checkvar_dictionary[name] = tk.IntVar()
            checkvar_dictionary[name].set(check)
            submenu.add_checkbutton(**options(name))
            extern_callback(name,check)

# === Spezielle Applikation ==============================================================
SYMBOL_FRAME_HEIGHT = 45
WINDOW_HEIGHT = 500

class Application(tk.Tk):
    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)

        contentframewidth = 200       

        # Symbolleiste
        self.symbolleisten = tk.Frame(self)
        self.symbolleisten.grid(row=0,column=0,sticky='nw')

        # Inhalt (Frames) der Symbolleiste
        self.leisten = {} # fuer funcSymbolleiste
        def symframe(column,name):
            frame = tk.LabelFrame(self.symbolleisten,text=name,width=contentframewidth)
            frame.grid(row=0,column=column,sticky='ns')
            self.leisten[name] = frame # fuer funcSymbolleiste
            return frame

        self.FrameFix = symframe(0,'Fix')
        self.Frame11  = symframe(1,'Datenbank')
        self.Frame12  = symframe(2,'Analyse')
        self.Frame13  = symframe(3,'Auswertung')
        self.Frame14  = symframe(4,'Export')

        # Minimale Breite des Anwendungsfensters
        self.grid_columnconfigure(0,minsize = 5*contentframewidth,pad=0,weight=0)
        # Minimale Hoehe der Symbolleiste
        self.symbolleisten.grid_rowconfigure(0,minsize = SYMBOL_FRAME_HEIGHT,pad=0,weight=0)
        # Hoehe des Bereiches darunter im Falle von Positionierung durch place wie bisher
        # - was eigentlich nicht sein sollte - ansonsten minimale Hoehe des Bereiches darunter
        self.grid_rowconfigure(1,minsize = WINDOW_HEIGHT,pad=0,weight=0)

        # Hier kaeme die sonstige GUI

        # Am Ende das Menue
        self['menu'] = AppMenu(self,self.funcSymbolleiste,activebackground = '#d9d9d9')

    def funcSymbolleiste(self,name,check):
        self.leisten[name].grid() if check else self.leisten[name].grid_remove()
            
Application().mainloop()
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@stefanxfg: wie bereits hier ausfürlich besprochen: viewtopic.php?f=18&t=40410#p308391
ist activebackground auf background zu setzen höchst unsinnig, denn ein Menübuttton erscheint dann ein Label zu sein, weil er nicht darauf reagiert, wenn man die Maus auf ihn bewegt.

Da kann man den Code nicht so stehen lassen. Daher nochmals zum letzern Mal:

Code: Alles auswählen

import tkinter as tk

# === Allgemeiner callback Aufruf fuer Menue Checkbuttons ==================================
CHECK_DEFAULTS = (('Datenbank', 1), ('Analyse', 0), ('Auswertung', 0), ('Export', 1))
CASCADE_LABEL = 'Symbolleisten'

class AppMenu(tk.Menu):
    def __init__(self,master,extern_callback,**kwargs):
        tk.Menu.__init__(self,master,**kwargs)

        # Menu GUI
        submenu = tk.Menu(self, tearoff=0)
        self.add_cascade(menu=submenu,label=CASCADE_LABEL)

        # add Checkbuttons und checke sie. blende Symbolleisten ein oder aus
        checkvar_dictionary = {} # fuer checken
        def options(name): return {
            'label'     : name,
            'variable'  : checkvar_dictionary[name],
            'command'   : lambda name = name : extern_callback(name,checkvar_dictionary[name].get())}

        for entry in CHECK_DEFAULTS:
            name = entry[0]
            check = entry[1]
            checkvar_dictionary[name] = tk.IntVar()
            checkvar_dictionary[name].set(check)
            submenu.add_checkbutton(**options(name))
            extern_callback(name,check)

# === Spezielle Applikation ==============================================================
SYMBOL_FRAME_HEIGHT = 45
WINDOW_HEIGHT = 500

class Application(tk.Tk):
    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)

        contentframewidth = 200       

        # Symbolleiste
        self.symbolleisten = tk.Frame(self)
        self.symbolleisten.grid(row=0,column=0,sticky='nw')

        # Inhalt (Frames) der Symbolleiste
        self.leisten = {} # fuer funcSymbolleiste
        def symframe(column,name):
            frame = tk.LabelFrame(self.symbolleisten,text=name,width=contentframewidth)
            frame.grid(row=0,column=column,sticky='ns')
            self.leisten[name] = frame # fuer funcSymbolleiste
            return frame

        self.FrameFix = symframe(0,'Fix')
        self.Frame11  = symframe(1,'Datenbank')
        self.Frame12  = symframe(2,'Analyse')
        self.Frame13  = symframe(3,'Auswertung')
        self.Frame14  = symframe(4,'Export')

        # Minimale Breite des Anwendungsfensters
        self.grid_columnconfigure(0,minsize = 5*contentframewidth,pad=0,weight=0)
        # Minimale Hoehe der Symbolleiste
        self.symbolleisten.grid_rowconfigure(0,minsize = SYMBOL_FRAME_HEIGHT,pad=0,weight=0)
        # Hoehe des Bereiches darunter im Falle von Positionierung durch place wie bisher
        # - was eigentlich nicht sein sollte - ansonsten minimale Hoehe des Bereiches darunter
        self.grid_rowconfigure(1,minsize = WINDOW_HEIGHT,pad=0,weight=0)

        # Hier kaeme die sonstige GUI

        # Am Ende das Menue
        self['menu'] = AppMenu(self,self.funcSymbolleiste)

    def funcSymbolleiste(self,name,check):
        self.leisten[name].grid() if check else self.leisten[name].grid_remove()
            
Application().mainloop()
Antworten