Menu-Fenster lässt sich nicht öffnen

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

Aus der Menüleiste öffne ich das Fenster „Teilnehmer erfassen“. Danach schliesse ich das Fenster mit „Quit“ und möchte das Fenster „Anzahl Bahnen erstellen“ öffnen. Leider wird der Inhalt nicht angezeigt. Schließe ich aber wieder das Fenster um weitere Teilnehmer zu erfassen, funktioniert alles problemlos.
Starte ich das Programm neu und wähle aus dem Menu zuerst „Anzahl Bahnen erstellen“ scheint alles einwandfrei zu funktionieren.
Ich kann den Fehler nicht finden und bitte um Hilfe.

Code: Alles auswählen

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

class Sport():

    def __init__(self):
        self.start()

    def start(self):
        self.mainframe = tk.Tk()

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

        self.mainframe.geometry('300x200+10+10')
        self.mainframe.title("Boule Turnier Software (Schweizer System)")

        menubar = tk.Menu(self.mainframe)

        #   Menubar Grundeinstellungen
        einstellungen = tk.Menu(menubar)
        einstellungen.add_command(label="Neues Turnier anlegen")
        einstellungen.add_command(label="Anzahl Bahnen erstellen", command=self.anz_bahnen)
        einstellungen.add_command(label="Teilnehmer erfassen", command=self.tn_erfassen)
        einstellungen.add_command(label='Exit', command=self.mainframe.destroy)
        menubar.add_cascade(label="Grundeinstellungen", menu=einstellungen)
        self.mainframe.config(menu=menubar)


        self.mainframe.mainloop()



    def anz_bahnen(self):
        entry_frame = Frame(self.mainframe)
        l1 = Label(entry_frame, text="Anzahl Bahnen").grid(row=0, column=0)
        self.anz_bahnen = Entry(entry_frame, relief='raised')
        self.anz_bahnen.grid(row=0, column=1, padx='1', pady='1', sticky='w')
        Button(entry_frame, text='Eingabe', relief='raised', command=self.number).grid(row=1, column=0, padx='1',
                                                                                       pady='1',
                                                                                       sticky='w')
        Button(entry_frame, text='Quit', relief='raised', command=self.reset).grid(row=1, column=1, padx='1', pady='1',
                                                                                   sticky='w')
        entry_frame.pack()

    def number(self):
        try:
            int(self.anz_bahnen.get())
            self.zahl = self.anz_bahnen.get()
            messagebox.showinfo("info",
                                "************************\nBahnen erfolgreich\nangelegt\n************************")
            # message_bahnen()
        except ValueError:
            pass
            # message_number()

    def reset(self):
        self.mainframe.destroy()
        self.start()

    def tn_erfassen(self):
        entry_frame = Frame(self.mainframe)
        l1 = Label(entry_frame, text="Teilnehmer").grid(row=0, column=0)
        self.anz_bahnen = Entry(entry_frame, relief='raised')
        self.anz_bahnen.grid(row=0, column=1, padx='1', pady='1', sticky='w')
        Button(entry_frame, text='Eingabe', relief='raised', command=self.number).grid(row=1, column=0, padx='1',
                                                                                       pady='1',
                                                                                       sticky='w')
        Button(entry_frame, text='Quit', relief='raised', command=self.reset).grid(row=1, column=1, padx='1', pady='1',
                                                                                   sticky='w')
        entry_frame.pack()





l1 = Sport()

Benutzeravatar
Axel-WAK
User
Beiträge: 62
Registriert: Dienstag 29. November 2022, 11:52

Warum zerstörst Du beim Schließen von "Teilnehmer erfassen" das Fenster und erstellst es dann jedes mal wieder neu?
OS: LMDE5 *** Homepage *** Github Seite
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Dateien werden immer utf8-codiert. Es gibt kein Argument dafür, ein anderes Encoding zu benutzen.
*-Importe benutzt man nicht. ›__init__‹ ist nicht sinnvoll, weil der ganze Code in ›start‹ steht. Also eigentlich sollte es ›start‹ gar nicht geben. Dann ist ›__init__‹ zum Initialisieren da, nicht dass das ganze Programm die ganze Zeit darin läuft; zumindest das ›mainloop‹ sollte nicht in __init__/start stehen.
Man setzt keine fixe Fenstergröße.
Eine Methode sollte nach einer Tätigkeit benannt sein, anz_bahnen ist keine Tätigkeit. Zudem überdeckt das Attribut ›anz_bahnen‹ das in der Methode ›anz_bahnen‹ gesetzt wird, überdeckt die Methode ›anz_bahnen‹.
›l1‹ ist ein schlechter Variablenname, der den Wert None enthält und eh nirgends benutzt wird.
Man benutzt keine Abkürzungen, tn_erfassen sollte besser teilnehmer_erfassen heißen.
In teilnehmer_erfassen wird anz_bahnen nochmal definiert! Und in beiden Frames wird ›number‹ aufgerufen!

Code: Alles auswählen

#!/usr/bin/env python3

import tkinter as tk
from tkinter import messagebox

class Sport():
    def __init__(self):
        self.mainframe = tk.Tk()
        self.mainframe.option_add('*tearOff', tk.FALSE)
        self.mainframe.title("Boule Turnier Software (Schweizer System)")

        menubar = tk.Menu(self.mainframe)

        #   Menubar Grundeinstellungen
        einstellungen = tk.Menu(menubar)
        einstellungen.add_command(label="Neues Turnier anlegen")
        einstellungen.add_command(label="Anzahl Bahnen erstellen", command=self.anzahl_bahnen_erfassen)
        einstellungen.add_command(label="Teilnehmer erfassen", command=self.teilnehmer_erfassen)
        einstellungen.add_command(label='Exit', command=self.mainframe.destroy)
        menubar.add_cascade(label="Grundeinstellungen", menu=einstellungen)
        self.mainframe.config(menu=menubar)

        self.anzahl_frame = tk.Frame(self.mainframe)
        tk.Label(self.anzahl_frame, text="Anzahl Bahnen").grid(row=0, column=0)
        self.anzahl_bahnen = tk.Entry(self.anzahl_frame, relief=tk.RAISED)
        self.anzahl_bahnen.grid(row=0, column=1, padx='1', pady='1', sticky=tk.W)
        tk.Button(self.anzahl_frame, text='Eingabe',
            relief=tk.RAISED, command=self.set_bahnen
        ).grid(row=1, column=0, padx='1', pady='1', sticky=tk.W)
        tk.Button(self.anzahl_frame, text='Quit',
            relief=tk.RAISED, command=self.reset
        ).grid(row=1, column=1, padx='1', pady='1', sticky=tk.W)

        self.teilnehmer_frame = tk.Frame(self.mainframe)
        tk.Label(self.teilnehmer_frame, text="Teilnehmer").grid(row=0, column=0)
        self.anzahl_teilnehmer = tk.Entry(self.teilnehmer_frame, relief=tk.RAISED)
        self.anzahl_teilnehmer.grid(row=0, column=1, padx='1', pady='1', sticky=tk.W)
        tk.Button(self.teilnehmer_frame, text='Eingabe',
            relief=tk.RAISED, command=self.set_teilnehmer
        ).grid(row=1, column=0, padx='1', pady='1', sticky=tk.W)
        tk.Button(self.teilnehmer_frame, text='Quit',
            relief=tk.RAISED, command=self.reset
        ).grid(row=1, column=1, padx='1', pady='1', sticky=tk.W)

        self.bahnen = None
        self.teilnehmer = None

    def anzahl_bahnen_erfassen(self):
        self.anzahl_frame.pack()

    def set_bahnen(self):
        try:
            self.bahnen = int(self.anzahl_bahnen.get())
        except ValueError:
            pass
        else:
            messagebox.showinfo("info",
                "************************\n"
                "Bahnen erfolgreich\n"
                "angelegt\n"
                "************************")
            self.anzahl_frame.pack_forget()

    def teilnehmer_erfassen(self):
        self.teilnehmer_frame.pack()

    def set_teilnehmer(self):
        try:
            self.teilnehmer = int(self.anzahl_teilnehmer.get())
        except ValueError:
            pass
        else:
            messagebox.showinfo("info",
                "************************\n"
                "Teilnehmer erfolgreich\n"
                "angelegt\n"
                "************************")
            self.teilnehmer_frame.pack_forget()

    def reset(self):
        self.anzahl_frame.pack_forget()
        self.teilnehmer_frame.pack_forget()


def main():
    sport = Sport()
    sport.mainframe.mainloop()

if __name__ == "__main__":
    main()
Tiger
User
Beiträge: 21
Registriert: Sonntag 25. Dezember 2022, 20:03

@Sirius3, vielen Dank für Deine ausführliche Hilfe.- Leider funktioniert das Programm noch immer nicht wie gewünscht.- Beispiel: Wenn das Menu-Fenster „Anzahl Bahnen erstellen“ geöffnet ist und ich klicke auf „Quit“ , sollte das Fenster leer sein.Ist es aber nicht.
Trotz zahlreichen Internet-Recherchen bin ich zu keinem Ergebnis gekommen. Kannst Du mir bitte auch hier helfen, oder habe ich ein Verständnis-Problem? Vielen Dank
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei mir funktioniert das Programm einwandfrei. Durch das pack_forget wird der Frame aus dem Fenster entfernt, Du hast also danach ein leeres Fenster.

Warum möchtest Du eigentlich eine so ungewöhnliche Art der Programmführung? Kennst Du irgendein anderes Programm, das so arbeitet wie Deins?
Es gibt normalerweise ein Hauptfenster, in dem bestimmte Informationen dargestellt werden (hier also irgendwas zum aktuellen Turnier).
Und dann gibt es einen "Einstellungen"-Menüpunkt oder ein "neues Turnier" oder was auch immer, der ein neues Fenster öffnet, wo man alle Einstellungen auf einmal sieht und nicht zwischen mehreren Frames wieder hin- und herwechseln muß, um einmal die Anzahl an Bahnen und das andere mal die Anzahl der Teilnehmer einzustellen.
Benutzeravatar
grubenfox
User
Beiträge: 432
Registriert: Freitag 2. Dezember 2022, 15:49

@Tiger
Gerade nebenan in einer neuen Frage gefunden:
https://www.youtube.com/watch?v=95tJO7XJlko

Vielleicht hilft das ja hier weiter.
Antworten