Konverter - Umwandeln von Datengröß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
bmeyer
User
Beiträge: 4
Registriert: Samstag 15. Juni 2019, 13:46

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:

Bild

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
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

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).
bmeyer
User
Beiträge: 4
Registriert: Samstag 15. Juni 2019, 13:46

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
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

`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.
bmeyer
User
Beiträge: 4
Registriert: Samstag 15. Juni 2019, 13:46

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
Antworten