Text in Label löschen

Fragen zu Tkinter.
Antworten
python4life
User
Beiträge: 4
Registriert: Montag 17. Oktober 2016, 14:47

Ich habe ein Programm geschrieben in dem man seinen BMI berechnet.
Durch den Button berechnen kann man die verschiedenen Herzzonen berechnen und die Ergebnisse werden in einem Label ausgegeben. Würde gerne wissen wie man diesen Text aus dem Label löscht.

Code: Alles auswählen

from Tkinter import*
alter_z = 0

def Fenster(): #definiert das grundfenster
    hzf = Tk()
    hzf.title("Herzzonenberechnung")
    hzf.geometry("600x400")
    hzf.configure(background = "pink")

    #textfenster definieren
    text_alter = Label(hzf,text = "Geben Sie Ihr Alter in Jahren ein")
    text_alter.place(x=25,y=50)
    text_alter.configure(background = "pink")

    #eingabefenster definieren
    alter_t = Entry(hzf)
    alter_t.place(x=250,y=50)

    #berechnen
    def berechnen():
        alter_z = int(alter_t.get())
        maxhzf = 220.0 - alter_z
           
        uebergang = maxhzf*0.55
        fettverbrennung = maxhzf*0.65
        aerobe = maxhzf*75
        anaerob = maxhzf*0.85

        #ausgabefenster 
        maxhz = Label(hzf,text = "Ihr max. Herzfrequenz beträgt")
        maxhz.place(x=25,y=100)
        maxhz.configure(background = "pink")
        maxhz_t = Label(hzf)
        maxhz_t.place(x=25,y=120)
        maxhz_t.configure(text=(maxhzf))
        maxhz_t.configure(background = "pink")

    #beenden
    def beenden():
        hzf.destroy()

    berechnen = Button(hzf,text = "Berechnen",command = berechnen)
    berechnen.place(x=400,y=50)
    ende = Button(hzf,text = "Quit",command = beenden)
    ende.place(x=500,y=50)

    hzf.mainloop()
Fenster()
Zuletzt geändert von Anonymous am Montag 17. Oktober 2016, 14:56, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@python4life: Wie man den Text in einem Label ändert weisst Du ja schon (`configure()`). Um den zu ”löschen” kann man auch eine leere Zeichenkette zuweisen. Wobei Du `configure()` überall unnötigerweise verwendest, denn die Argumente hätte man jeweils auch kurz davor beim Erstellen der Widgets schon angeben können.

Dein Problem ist eher die Programmstruktur mit den verschachtelten Funktionen, statt das objektorientiert zu lösen, was bei jeder nicht-trivialen GUI eigentlich nötig wäre.

Neben den ganzen inneren Funktionen die man so nicht schreiben würde, gibt es noch ein paar andere Probleme bei dem Quelltext.

Da wäre der Sternchen-Import, der einem das Modul mit ca. 190 Namen zumüllt, von denen Du nur sehr wenige tatsächlich verwendest. Bei Sternchen-Importen weiss man nicht mehr so einfach wo ein Name eigentlich her kommt. Ausserdem besteht die Gefahr von Namenskollisionen.

Namen sollten keine kryptischen Abkürzungen enthalten oder gar nur aus solchen bestehen. `hzf` zum Beispiel. „Herzzonenfenster“? Was ist dann `maxhzf`? Das maximale Herzzonenfenster? Das ist aber gar nicht an eine Fenster gebunden sondern an eine Zahl. Was soll das `_z` bei `alter_z`? Anzeigen das es eine Zahl ist? Das sollte bei einer Altersangabe eigentlich klar sein, denn wie gibt man das sonst an?

`geometry()` ist oft unnötig und `place()` sollte man nicht verwenden. Da gibt es nur wenige sinvolle Einsatzzwecke für und wenn man `pack()` oder `grid()` verwenden würde, müsste man auch die Fenstergrösse nicht selber angeben. Absolutes Positionieren von GUI-Elementen kann auf anderen Rechnern, mit anderer Hardware und Systemeinstellungen anders aussehen. Und nicht nur komisch/falsch, sondern in unglücklichen Fällen sogar unbenutzbar.

Üblicherweise erstellt man die GUI am Anfang komplett und fügt nicht nach dem Berechnen erst die Label für das Ergebnis hinzu. Dann hat man dieses Problem mit dem ”löschen” auch gar nicht, denn dann ändert man einfach die Ergebnisanzeige mit jedem Ergebnis und braucht keinen Unterschiedlichen Code für die erste und dann alle folgenden Berechnungen.

Du solltest auch die Programmlogik von der GUI trennen. Also in diesem Fall die Berechnung(en) in Funktionen auslagern die nichts mit der GUI zu tun haben. Diese Berechnungen sind ja unabhängig davon wie/wo der Benutzer die Daten eingeben hat, und wie und wo die Ergebnisse dargestellt werden.

Was hat der BMI mit der Herzfrequenz zu tun?
python4life
User
Beiträge: 4
Registriert: Montag 17. Oktober 2016, 14:47

Danke für deine Antwort, jedoch finde ich in deinem Text keine Lösung für mein Problem. Ich bin noch Anfänger und weiß dass einige Sachen noch nicht ganz richtig sind.
LG python4life
BlackJack

@python4life: Das Problem ist die gesamte Programmstruktur. Da gibt es keine einfache Lösung für, die nicht auf so ziemlich komplett anders schreiben hinaus läuft. Man muss dafür entweder Funktionen richtig schreiben und Closures verstehen (mindestens `functools.partial()`) oder objektorientierte Programmierung (OOP). Wobei für OOP wieder echte, saubere Funktionen Grundlage sind.

GUI-Programmierung würde ich vielleicht erst einmal zurück stellen bis OOP halbwegs sitzt. Sonst muss man sich mit beiden, komplexen Themen gleichzeitig auseinander setzen.
Antworten