Fenster wird 2x geöffnet

Fragen zu Tkinter.
Antworten
Tiger
User
Beiträge: 21
Registriert: Sonntag 25. Dezember 2022, 20:03

Wenn ich das nachfolgende Programm starte, wird das gleiche Fenster 2x geöffnet. Ich finde nicht den Fehler.
Umgebung: MAC
Bitte um Hilfe.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
from tkinter import *


class Hauptfenster:

    def __init__(self, root):

        root.title('Ein Spielprogramm')

        # eine Musszeile!!!!
        root.option_add('*tearOff', FALSE)

        win = Toplevel(root)
        menubar = Menu(win)
        win['menu'] = menubar

        #   Menubar Grundeinstellungen
        menu_einstellungen = Menu(win)
        menu_einstellungen.add_command(label='Neues Turnier', command=self.neue_tabellen)
        menu_einstellungen.add_separator()
        menu_einstellungen.add_command(label='Anzahl Bahnen', command=self.bahnen)
        menu_einstellungen.add_separator()
        menu_einstellungen.add_command(label='Teilnehmer erfassen', command=self.tn_erfassen)
        menu_einstellungen.add_separator()
        menu_einstellungen.add_command(label='Exit', command=win.destroy)
        menu_einstellungen.add_separator()
        menubar.add_cascade(menu=menu_einstellungen, label='Grundeinstellung')

        #   Menubar Nächste Spielbetrieb
        menu_Spielbetrieb = Menu(win)
        menu_Spielbetrieb.add_command(label='Neue Runde', command=self.neue_runde)
        menu_Spielbetrieb.add_separator()
        menu_Spielbetrieb.add_command(label='Exit', command=win.destroy)
        menu_Spielbetrieb.add_separator()
        menubar.add_cascade(menu=menu_Spielbetrieb, label='Spielbetrieb')



    def neue_tabellen(self):
        print('aka')

    def bahnen(self):
        pass

    def tn_erfassen(self):
        pass

    def neue_runde(self):
        pass


root = Tk()
Hauptfenster(root)
root.mainloop()

Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tiger: Das gleiche Fenster? Du erstellst da zwei Fenster. Und das sieht nicht wirklich sinnvoll aus.

Die Klasse würde ich auch nicht `Hauptfenster` nennen, weil sie ja gar kein Fenster repräsentiert. Das Hauptfenster in `tkinter`-Anwendungen ist das `Tk`-Objekt. `Hauptfenster` würde ich so eine Klasse nur nennen, falls sie von `Tk` erbt, und damit tatsächlich das Fenster repräsentiert.

So ein Seperator in einem Menü ist dazu da um Gruppen von Menüeinträgen voneinander abzusetzen, nicht um den zwischen jeden einzelnen Menüeintrag zu ballern.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Opa Hansi
User
Beiträge: 13
Registriert: Sonntag 12. März 2023, 10:21

Versuche mal
command=lambda : funktion()
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Opa Hansi: lambda-Funktionen sind einfache Funktionen, die nur aus einem Ausdruck bestehen, wenn eine Funktion für sehr einfache Dinge gebraucht werden.
Oft wird lambda mißbraucht, für Callbacks, um zusätzliche Parameter an Funktionen zu binden, wo man besser functools.partial benutzen würde.
Du benutzt hier lambda, um eine andere Funktion aufzurufen, ohne zusätzliche Parameter; das ist also völlig überflüssig und ›command=funktion‹ ist hier der richtige Weg.
Auch wenn bei Tkinter-Callbacks oft der Fehler gemacht wird, die Funktion sofort aufzurufen, statt sie als Parameter zu übergeben, ist das hier nicht der Fall.
Benutzeravatar
Axel-WAK
User
Beiträge: 62
Registriert: Dienstag 29. November 2022, 11:52

Braucht es eigentlich eine Klasse?

Code: Alles auswählen

from tkinter import Tk, Menu

def neue_tabellen():
    print('aka')

def bahnen():
    pass

def tn_erfassen():
    pass

def neue_runde():
    pass
    
root = Tk()
root.option_add('*tearOff', False)
root.title('Ein Spielprogramm')
root.geometry("500x300")
menubar = Menu(root)
root['menu'] = menubar

#   Menubar Grundeinstellungen
menu_einstellungen = Menu(root)
menu_einstellungen.add_command(label='Neues Turnier', command=neue_tabellen)
menu_einstellungen.add_command(label='Anzahl Bahnen', command=bahnen)
menu_einstellungen.add_command(label='Teilnehmer erfassen', command=tn_erfassen)
menubar.add_cascade(menu=menu_einstellungen, label='Grundeinstellung')
menu_einstellungen.add_separator()
menu_einstellungen.add_command(label='Exit', command=root.destroy)

#   Menubar Nächste Spielbetrieb
menu_Spielbetrieb = Menu(root)
menu_Spielbetrieb.add_command(label='Neue Runde', command=neue_runde)
menu_Spielbetrieb.add_separator()
menu_Spielbetrieb.add_command(label='Exit', command=root.destroy)
menubar.add_cascade(menu=menu_Spielbetrieb, label='Spielbetrieb')

root.mainloop()
OS: LMDE5 *** Homepage *** Github Seite
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Axel-WAK: Da der Code nach den Funktionen auch in einer Funktion stehen muss, und man in den Rückruffunktionen sicherlich auf gemeinsamen Zustand zugreifen muss, braucht man auch eine Klasse.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten