Fenster öffnen und Fenster schließen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Alter Mann
User
Beiträge: 8
Registriert: Donnerstag 14. September 2023, 18:33

Hi Forum,
ich bin neu hier und ein Neuling in Sachen Python und Tkinter.
Mittels Button möchte ich aus meinem BMI.py ein anders Python-Programms BMI aufrufen. Das funktioniert.
Mein Problem besteht nun darin, dass zwei Fenster übereinander liegen. Es sollte so sein, wenn ich das neue Programm aufrufe, sollte das alte geschlossen werden.
Mein Code:

Code: Alles auswählen

btn_ende = Button(fF, text="Beenden", bg="darkred", fg="white", width=17, command=getMessageFrage)
Ich habe schon mit lamda expermientiert aber kein Erfolg gehabt. Wie bekomme ich command destro dazugepackt?

Vielen Dank im Voraus
Manfred
Sirius3
User
Beiträge: 17828
Registriert: Sonntag 21. Oktober 2012, 17:20

Es ist verwirrend, wenn man auf den Beenden-Button drückt möchte man doch, dass das aktuelle Programm beendet wird und kein anderes gestartet.

Da Du Button direkt benutzt, ist zu befürchten, dass Du tkinter per * importierst, was man nicht machen sollte, da das unkontrolliert Namen in den eigenen Namensraum schaufelt.
Variablennamen und Funktionen werden komplett klein geschrieben. Man benutzt keine kryptischen Abkürzungen, also button statt btn und was fF bedeuten soll, da kann man nur raten.
Bei einer Funktion die get... heißt, erwartet man, dass man tätschlich eine Frage zurückbekommt, was bei Ereignisfunktionen aber Unsinn ist, weil mit dem Rückgabewert ja nichts gemacht wird. Auf keinen Fall erwartet man bei dem Namen, dass das Programm beendet und ein anderes gestartet wird.

Ich habe das Gefühl, als ob Du hier versuchst ein ganz anderes Problem zu lösen; da können wir aber nur helfen, wenn Du Dein Programm und was es tun soll etwas ausführlicher vorstellst.
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo Alter Mann,

so kann ich mich auch bald nennen....

Zusätzlich zu den Anmerkungen von Sirius, es darf nur ein Exemplar von Tk() geben.
Also wenn Du das zweite"Programm" startest, muss dieses mit dem selben Rootfenster funktionieren,
wie das erste "Programm". Also root an das zweite "Programm" übergeben.
Ich hab ein kleines Beispiel, wie Fenster verschwinden und wieder hervor geholt werden.

Code: Alles auswählen

import tkinter as tk
from functools import partial

def main(root):    
    erstes_fenster = tk.Frame(root)
    erstes_fenster.grid(column=0, row=0)
    textfenster = tk.Label(erstes_fenster, text='Mein erstes\nFenster')
    tastentext = 'Weiter zum\n2. Fenster'
    taste_schliesse_erstes = tk.Button(erstes_fenster, text=tastentext, bd=5,
                                       command=partial(schliesse_erstes,
                                                       root, erstes_fenster))
    textfenster.grid(column=0, row=0)
    taste_schliesse_erstes.grid(column=0, row=1)

def schliesse_erstes(root, erstes_fenster):    
    erstelle_zweites_fenster(root, erstes_fenster)
    erstes_fenster.grid_forget()

def erstelle_zweites_fenster(root, erstes_fenster):
    zweites_fenster = tk.Frame(root, erstes_fenster)
    zweites_fenster.grid(column=0,row=0)
    textfenster = tk.Label(zweites_fenster, text='Mein zweites Fenster',
                           bd=5, justify='center', bg='yellow').grid(column=1,
                                                                  row=0)
    tastentext = 'Zurück zum\nerstenFenster'
    taste_zurueck = tk.Button(zweites_fenster, text=tastentext,bg='green',
                              command=partial(zeige_erstes_fenster,
                                              root, erstes_fenster,
                                              zweites_fenster)).grid(column=0,
                                                                     row=1)
    taste_ende = tk.Button(zweites_fenster, command=partial(beende, root),
                           text='Anwendung\nbeenden', bd=5, bg='red').grid(
                               column=2, row=1)    

def zeige_erstes_fenster(root, erstes_fenster, zweites_fenster):
    zweites_fenster.destroy()
    erstes_fenster.grid(column=0, row=0)

def beende(root):
    root.destroy()
                                       
if __name__ == ''__main__':
    root = tk.Tk()    
    main(root)
    root.mainloop()
Gruss Peter
Alter Mann
User
Beiträge: 8
Registriert: Donnerstag 14. September 2023, 18:33

Hallo Sirius3, hallo peterpy,

wie gesagt ich bin Neuling, schon etwas älter und versuche mich geistig fit zu halten und dafür Python für mich ausgeguckt. Ander machen Sudoku.

danke für eure Antworten.
@Sirius3
Ich habe mein Fenster in drei Frames eingeteilt . fF steht für FooterFrame. Ich werde mich bemühen, deine Anmerkungen zum Gestalten des Codes beherzigen. Nur zur Anmerkung. Ich möchte das neue Fenster nicht mit dem Beenden-Button öffnen, sondern mit einer Schaltfläche zum Programmstart. Der gepostete Code sollte eigentlich gekoppelt werden mit dem Aufruf neues Fenster öffnen.

@peterpy
Ich werden deinen Code am Wochenende durcharbeiten und versuchen ihn zu verstehen.

Ich wünsche ein schönes Wochenende

Gruß Manfred
Alter Mann
User
Beiträge: 8
Registriert: Donnerstag 14. September 2023, 18:33

Hallo peterpy,

ich habe deinen Code ausprobiert und festgestellt, dass ist so ungefähr das was ich brauche. Ich werde versuchen, es in meinen Code zu implementieren.
Vielen Dank und bleib gesund.

Viele Grüße

Manfred
Antworten