Wie schließt man ein Menü?

Fragen zu Tkinter.
Antworten
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Solange ein Menü geöffnet ist, geht nichts Anderes. An einer Stelle rechts vom Menü ist ein Toplevel. Darin geht nichts, solange das Menü geöffnet ist. Also müßte ich, wenn jemand nach rechts mit der Maus in das Toplevel wechselt, das Menü schließen.

Wie geht das?
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Lösung gefunden. Das Hauptmenü aus und einhängen:

Code: Alles auswählen

        self.master.master.master['menu']=''
        self.master.master.master['menu']=self.master.master.master.menu
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

"master.master.master" zeigt ja schon, dass etwas am Programmdesign nicht stimmt. Ansonsten würde ich das nicht als Lösung sondern als Hack bezeichnen. Hacks haben beim Programmieren nichts zu suchen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Sirius3 hat geschrieben:"master.master.master" zeigt ja schon, dass etwas am Programmdesign nicht stimmt. Ansonsten würde ich das nicht als Lösung sondern als Hack bezeichnen. Hacks haben beim Programmieren nichts zu suchen.
Das ist ja auch noch keine fertige Lösung. Das sind nur einmal Experimente.

Außerde funktioniert es auch gar nicht richtig so. Das Menü merkt sich dass es nicht richtig geschlossen wurde und reagiert beim nächstenmal nicht richtig. Der Mauszeiger zeigt plötzlich ein weinig nach rechts unbd wenn man dann außerhalb des Menüs klickt, dann geht es nicht zu. Zudem steht es dann an oberster Front über alles sonstigen Anwendungsfenstern.

Statt es nur aus und wieder einzuhängen, bleibt nur, es vollständig zu löschen mit einem destroy auf das komplette Menü. Es sei denn, ich wüßte, wie man einen Mausklick simulert. Das dürfte aber schwierig sein, denn das wäre ein System Mausklick. Das Menü geht ja auch zu, wenn man irgendwohin auf den Bildschirm klickt. Damit dürfte eine Mausklick Simulation in tkinter wohl nichts bringen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Sirius3 hat geschrieben:"master.master.master" zeigt ja schon, dass etwas am Programmdesign nicht stimmt.
Das Programmdesign ist ja noch gar nicht da.

Das ist das Grobdesign:

Code: Alles auswählen

import tkinter as tk

class MainMenuCreate(tk.Menu):

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

        # destroy menu before ===============
        menu_before = master['menu']
        if menu_before:
            master['menu'] = ''
            self.nametowidget(menu_before).destroy()
            print('menu_before destroyed')

        # define menu =======================

        # ...

        # enable menu =======================
        master['menu'] = self

def MainMenu(master,**kwargs):
    master.after_idle(
        lambda
        call = MainMenuCreate,
        master = master,
        kwargs = kwargs:
        call(master,**kwargs))

class Application(tk.Tk):
 
    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        # widget definitions ===================================
        MainMenu(self)

        # test it ==============
        MainMenu(self)

if __name__ == '__main__':
    Application().mainloop()
Das heißt das MainMenu kann jederzeit wieder neu aufgebaut werden. Der Aufruf kann sogar vom MainMenu aus erfolgen, das zerstört werden soll, denn der Aufbau erfolgt erst nach after_idle.
Antworten