Seite 1 von 1
Konverter - Umwandeln von Datengrößen
Verfasst: Samstag 15. Juni 2019, 14:23
von bmeyer
Guten Tag zusammen,
derzeit programmiere ich einen GUI Konverter (rechnet Datengrößen (z.B. Bit -> Kilobit) um).
Dabei bin ich schon öfters auf Fehler gestoßen, die ich mit Eigenrecherche in Literaturbüchern oder mithilfe von Foreneinträgen lösen konnte.
Mein Problem ist, dass das "Ergebnis" nur mit zwei Nachkommastellen angezeigt wird:
Benötigte Schnipsel, um mir ggf. bei meinem Problem zu helfen / Anregungen zu geben:
Code: Alles auswählen
from tkinter import Tk, StringVar, ttk
from tkinter import *
umwandeln = DoubleVar()
ergebnis = DoubleVar()
def Umwandeln():
if wert0.get() == "Bit" and wert1.get() == "Kilobit":
umwandeln1 = float(umwandeln.get() / 1000)
umwandeln2 = "Einheit", str('%.5f' %(umwandeln1))
ergebnis.set(umwandeln2)
Ich habe schon verschiedenes ausprobiert. (auch das Modul decimal) Leider ohne Erfolg.
Ich bin dankbar über jede Anregung, jeden Tipp, jede Hilfe
Schönen Tag noch,
Ben
Re: Konverter - Umwandeln von Datengrößen
Verfasst: Samstag 15. Juni 2019, 14:50
von Sirius3
Sternchenimporte sind nicht gut, weil man sich damit unkontrollierbar hunderte Namen in den Namensraum schaufelt. In der ersten Zeile hast Du es doch schon vorgemacht, wie es anders geht. Üblich ist es aber „import tkinter as tk” zu schreiben und alle Namen per tk.xy anzusprechen.
Funktionsnamen schreibt man nach Konvention klein (›umwandeln‹) und eine Funktion bekommt alles, was sie braucht, über ihre Argumente, also wert0, wert1, umwandeln und ergebnis. Bis auf ›ergebnis‹ sind alles schlechte Variablennamen, weil wert0 und wert1 nicht wirklich beschreibt, was das denn für Werte sind (quell_einheit und ziel_einheit) und umwandeln eine Tätigkeit ist, mit der man besser Funktionen benennt.
An den 4 Argumenten, die umwandeln braucht, wird auch deutlich, dass bald schon der Punkt erreicht ist, wo GUIs ohne Klassendefinitionen nicht mehr wartbar sind.
Eine Fließkommazahl nochmal mit float umzuwandeln, macht sie nicht flüssiger.
Einen String nochmal mit str umzuwandeln, ist genauso unsinnig.
`ergebnis` ist ein DoubleVar, da ein Tuple mit String und formatierter Zahl hineinzupacken, macht keinen Sinn, was Tk auch damit quitiert, dass es einfach 0 annimmt und das dann auch als 0.0 ausgibt. Wenn Du Formatierten Text ausgeben willst, nimm StringVar und schreibe dort auch Strings hinein (keine Tuple).
Re: Konverter - Umwandeln von Datengrößen
Verfasst: Samstag 15. Juni 2019, 15:12
von bmeyer
Erstmal vielen Dank für deine schnelle Antwort!
Sirius3 hat geschrieben: Samstag 15. Juni 2019, 14:50
Sternchenimporte sind nicht gut, weil man sich damit unkontrollierbar hunderte Namen in den Namensraum schaufelt. In der ersten Zeile hast Du es doch schon vorgemacht, wie es anders geht. Üblich ist es aber „import tkinter as tk” zu schreiben und alle Namen per tk.xy anzusprechen.
Funktionsnamen schreibt man nach Konvention klein (›umwandeln‹) und eine Funktion bekommt alles, was sie braucht, über ihre Argumente, also wert0, wert1, umwandeln und ergebnis. Bis auf ›ergebnis‹ sind alles schlechte Variablennamen, weil wert0 und wert1 nicht wirklich beschreibt, was das denn für Werte sind (quell_einheit und ziel_einheit) und umwandeln eine Tätigkeit ist, mit der man besser Funktionen benennt.
An den 4 Argumenten, die umwandeln braucht, wird auch deutlich, dass bald schon der Punkt erreicht ist, wo GUIs ohne Klassendefinitionen nicht mehr wartbar sind.
Eine Fließkommazahl nochmal mit float umzuwandeln, macht sie nicht flüssiger.
Einen String nochmal mit str umzuwandeln, ist genauso unsinnig.
`ergebnis` ist ein DoubleVar, da ein Tuple mit String und formatierter Zahl hineinzupacken, macht keinen Sinn, was Tk auch damit quitiert, dass es einfach 0 annimmt und das dann auch als 0.0 ausgibt. Wenn Du Formatierten Text ausgeben willst, nimm StringVar und schreibe dort auch Strings hinein (keine Tuple).
Bei deinen Punkten gebe ich dir völlig Recht. Die Variablennamen, sowie den Sternchenimport & die Funktionsnamen habe ich angepasst.
Die zwei Zeilen (mit der Umwandlung), habe ich abgewandelt:
Code: Alles auswählen
einheit_quelle = StringVar()
einheit_ziel = StringVar()
benutzereingabe = DoubleVar()
ergebnis = DoubleVar()
def umwandeln():
if einheit_quelle.get() == "Bit" and einheit_ziel.get() == "Kilobit":
benutzereingabe1 = str(benutzereingabe.get() / 1000)
ergebnis.set(benutzereingabe1)
Trotzdem erhalte ich noch den selben "Fehler". Ich vermute es liegt an der Variable "benutzereingabe1".
Habe verschiedene Wege ausprobiert (Float, str, etc.) Könntest du mir da behilflich sein?
Nochmal vielen Dank und Liebe Grüße,
Ben
Re: Konverter - Umwandeln von Datengrößen
Verfasst: Samstag 15. Juni 2019, 15:39
von Sirius3
`ergebnis` ist ein DoubleVar, also eine Fließkommazahl, beim Darstellen der Zahl benutzt Tk eine Standarddarstellung.
Um mich selbst zu zitieren: Wenn Du Formatierten Text ausgeben willst, nimm StringVar.
Re: Konverter - Umwandeln von Datengrößen
Verfasst: Samstag 15. Juni 2019, 16:03
von bmeyer
Sirius3 hat geschrieben: Samstag 15. Juni 2019, 15:39
`ergebnis` ist ein DoubleVar, also eine Fließkommazahl, beim Darstellen der Zahl benutzt Tk eine Standarddarstellung.
Um mich selbst zu zitieren: Wenn Du Formatierten Text ausgeben willst, nimm StringVar.
Ich bin dir unendlich dankbar
StringVar funktioniert.
Wünsche dir ein schönes Wochenende.
LG Ben