Inhalt eines Labels löschen

Fragen zu Tkinter.
Antworten
maui.py
User
Beiträge: 1
Registriert: Freitag 14. Oktober 2016, 08:36

Servus, ich habe jetzt mit TKinter begonnen und habe einen kleinen Converter geschrieben, dieser wandelt Zahlen aus dem Dezimal-System in ein beliebig Anderes bis Hexadezimal um. Nichts Großes, ist nur zum testen und "rein kommen" in TKinter.

Jetzt möchte man vielleicht, mehrere Zahlen konvertieren, und hier ist auch mein Problem:
Wenn ich eine neue Zahl konvertiere, ist das Ergebnis von der davor noch im Label gespeichert, wie kann ich das Ergebnis da heraus löschen?
Ich möchte nicht das Label an sich löschen, nur den Inhalt!


Hier mal mein Code: falls ihr euch wundert was in Zeile 50 steht? ich weis es auch nicht xD das kam jetzt von dem Forum...

Code: Alles auswählen

from tkinter import *

hexValue = {10: "A", 11: "B", 12: "C", 13: "D", 14: "E", 15: "F"}
valueList = []


def converter():
    num = int(inp_num.get())

    stat = False

    while not stat:
        if num > 0:
            rest = num % lib_sys.get("active")
            if lib_sys.get("active") > 10 and rest > 9:
                valueList.append(hexValue[rest])
            else:
                valueList.append(rest)
            num //= lib_sys.get("active")
        else:
            stat = True
    make_string()


def erase():
    lab_res["text"] = ""


def make_string():
    valueList.reverse()
    lab_res["text"] = (" ".join(str(x) for x in valueList))


main = Tk()
main["bg"] = "light grey"
main.title("Dec To")
main.geometry("305x150")

scb_sys = Scrollbar(main, orient="vertical")
scb_sys.grid(row=0, column=2, sticky="ns")

lib_sys = Listbox(main, height=4, yscrollcommand=scb_sys.set, font="Lucida 10 bold", relief="flat")
scb_sys["command"] = lib_sys.yview
lib_sys.insert("end", 2)
lib_sys.insert("end", 3)
lib_sys.insert("end", 4)
lib_sys.insert("end", 5)
lib_sys.insert("end", 6)
lib_sys.insert("end", 7)
lib_sys.insert("end", 8)
lib_sys.insert("end", 9)
lib_sys.insert("end", 10)
lib_sys.insert("end", 11)
lib_sys.insert("end", 12)
lib_sys.insert("end", 13)
lib_sys.insert("end", 14)
lib_sys.insert("end", 15)
lib_sys.insert("end", 16)
lib_sys.grid(row=0, column=1, sticky="we")

inp_num = Entry(main, text="Zahl", font="Lucida 10 bold", relief="flat")
inp_num.grid(row=0, column=0, sticky="we")
inp_num.grid(sticky="ns")


lab_res = Label(text="Ergebnis: ")
lab_res["font"] = "Lucida 10 bold"
lab_res["bg"] = "Grey"
lab_res["fg"] = "White"
lab_res["width"] = "35"
lab_res["relief"] = "flat"
lab_res.bind("<Return>", converter)
lab_res.grid(row=2, column=0, columnspan=2)

btn_convert = Button(main, text="Berechnen", command=converter, font="Lucida 10 bold", relief="flat")
btn_convert.grid(row=1, column=0, columnspan=2, sticky="we")

btn_erase = Button(main, text="Löschen", fg="white", bg="dark red", command=erase, font="Lucida 10 bold", relief="flat")
btn_erase.grid(row=3, column=0, sticky="we")

btn_quit = Button(main, text="Beenden", fg="white", bg="dark red", command=main.destroy, font="Lucida 10 bold", relief="flat")
btn_quit.grid(row=3, column=1, sticky="we")

mainloop()

Ich habe aus eigenen Recherchen leider nicht herausgefunden, nur wie man das ganze Label löscht(.forget()), aber das will ich ja gar nicht.
Ich würde mich echt über eine Antwort freuen, Vielen Dank

MfG
maui.py
MfG
maui.py
BlackJack

@maui.py: Ich würde sagen die Frage ist falsch, denn auf *die* Frage steht die Antwort schon im Quelltext. Man setzt den Inhalt des Labels einfach auf eine leere Zeichenkette.

Das Problem in dem Programm ist eher das die Ziffern in der globalen `valueList` gespeichert werden. Das hat mit der GUI nichts zu tun. *Das* Problem löst man in dem man ”echte” Funktionen schreibt und deshalb dann keine globalen Variablen mehr verwendet.

Du verwendest ``def`` nur dazu Code-Abschnitten Namen zu geben, damit man die im Programmverlauf anspringen kann. Und dann verwenden die einfach so Variablen die auf ”magische” Weise in der Umgebung existieren und manipulieren globalen Zustand. Das ist keine korrekte Verwendung von Funktionen. Die sind dazu gedacht in sich abgeschlossene Aufgaben zu lösen wofür sie die Werte als Argumente übergeben bekommen, und eventuelle Rückgabewerte per ``return`` an den Aufrufer zurück geben. Auf Modulebene gehören nur Definitionen von Konstanten, die KOMPLETT_GROSS geschrieben werden, Klassen (werden in MixedCase geschrieben), und Funktionen. Funktionen, Methoden, und andere Werte werden klein_mit_unterstrichen geschrieben. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

GUI und Programmlogik sollte man sauber trennen. Das Umwandeln einer Zahldarstellung in eine andere hat nichts mit GUI zu tun, also sollte so eine Funktion auch keine GUI-Objekte kennen müssen.

Vor GUI-Programmierung sollte man sich objektorientierte Programmierung angeschaut haben, denn die braucht man für jede nicht-triviale GUI. Ein bisschen kann man noch mit `functools.partial()` machen, aber das erreicht schnell den Punkt wo es unübersichtlich und umständlich wird.

Sternchen-Importe sind Böse™. Bei Tkinter holst Du Dir damit cirka 190 Namen ins Modul.

Viele Namen sind nicht gut gewählt. Namen sollen dem Leser verraten was der Wert dahinter bedeutet und nicht durch kryptsiche Abkürzungen zum Rätselraten führen. `lib_sys` habe ich zum Beispiel nicht ”entschlüssel” können. `hexValue` steht nicht für einen Wert, sondern für ein Wörterbuch in dem viele Werte stehen. Bei solchen Abbildungen bietet es sich an einen Namen nach dem Muster x2y zu wählen, wobei x und y jeweils die Bedeutung eines einzelnen Schlüssels und Wertes beschreiben. `value2hex_digit` beispielsweise.

`stat` macht keinen Sinn. Da kann man auch gleich die ``if``-Bedingung für die ``while``-Schleife verwenden.

Konkrete Grunddatentypen haben in Namen nichts verloren. Wenn man den Datentyp dann irgendwann mal ändert, dann hat man entweder falsche, irreführende Namen oder muss die immer alle ändern.

Funktionen werden üblicherweise nach Tätigkeiten benannt, um sie besser von eher passiven Werten unterscheiden zu können.

`make_string()` beschreibt nicht wirklich treffend was da passiert.

Die Zeilen 44 bis 58 würde man mit einer Schleife in zwei Zeilen lösen.
Antworten