Der Counter von tkinter

Fragen zu Tkinter.
Antworten
rattionline
User
Beiträge: 2
Registriert: Samstag 10. März 2018, 14:46

Hallo liebes Forum,

Ich habe ein kleins GUI geschrieben in dem das klicken auf den jeweiligen Button den Wert im Counter um +- 10 bzw +-0.1 erhöhen oder abziehen soll.
Sobald ich mehrmals auf +0.1 oder -0.1 klicke fügt das Programm aber weitere Dezimalstellen hinzu, zB: 0.499999 oder auch mal 1.5864284651668
Wenn ich dann noch ein paar mal den Wert um 0.1 erhöhe oder verringere kommt wieder ein Wert mit einer Nachkommastelle raus.

Kann mir jemand sagen woran es liegen kann?
Oder sogar eine andere Möglichkeit nennen wie ich die Werte der Buttons am besten zusammengerechnet bekomme?


Code: Alles auswählen


from tkinter import *
import tkinter
import sys

#GUI
fenster = Tk()
fenster.title("referenz")
fenster.geometry("640x480+200+150")
fenster.configure(background="#2D2D2D")



#Funktion der Buttons
def Plus(event=None):
    counter.set(counter.get() + 0.1)
def Minus(event=None):
	counter.set(counter.get() - 0.1)
def Plus10(event=None):
    counter.set(counter.get() + 10)
def Minus10(event=None):
    counter.set(counter.get() - 10)


#Zähler mit Dezimalstelle
counter = tkinter.DoubleVar()


#---------Counter---------
L1 = Label(fenster, textvariable=counter)
L1.config(height = 10, width = 10)
L1.place(x=100, y=20)

#---------Plus 0.1 Button----------
b1=Button(fenster, text="PLUS", command=Plus)
b1.config( height = 5, width = 10 )
b1.place(x=0, y=20)

#-------Minus 0.1 Button-------
b2=Button(fenster, text="MINUS", command=Minus)
b2.config(height = 5, width = 10)
b2.place(x=200, y=20)


#---------Plus 10 Button----------
b3=Button(fenster, text="PLUS10", command=Plus10)
b3.config( height = 5, width = 10 )
b3.place(x=0, y=100)

#-------Minus 10 Button-------
b4=Button(fenster, text="MINUS10", command=Minus10)
b4.config(height = 5, width = 10)
b4.place(x=200, y=100)





fenster.mainloop()

MFG :)
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist das Wunder der Fliesskommazahlen. Die offizielle Doku hat da ein ganzes Kapitel drüber:

https://docs.python.org/3/tutorial/floatingpoint.html
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi rattionline

Meine Tipps:
a) Versuche dein Programmierstil nach den PythonStyleGuide PEP8 Richtlinien zu gestalten. https://www.python.org/dev/peps/pep-0008/
b) Importiere das tkinter Modul als import tkinter as tk
c) GUI's nur in OOP (als Klassen) programmieren

Hier das modifizierte Skript:

Code: Alles auswählen

import tkinter as tk

APP_TITLE = "Counter"
APP_XPOS = 200
APP_YPOS = 150
APP_WIDTH = 640
APP_HEIGHT = 480


class Application(object):
    LABEL_FONT = ("helvetica", 16, "bold")
    LABEL_FG = 'blue'
    LABEL_BG = 'khaki3'
    
    def __init__(self, main_win):
        self.main_win = main_win

        self.build()
        self.update_counter(0.0)
        
    def build(self):
        self.main_frame = tk.Frame(self.main_win)
        self.main_frame.pack(expand=True)

        self.counter = 0.0
        self.var_counter_label = tk.StringVar()
        
        tk.Button(self.main_frame, text="PLUS", command=self.plus,
            height=5, width=10).grid(row=0, column=0, sticky='news')
        
        tk.Button(self.main_frame, text="PLUS10", command=self.plus10,
            height=5, width=10).grid(row=1, column=0, sticky='news')

        tk.Label(self.main_frame, textvariable=self.var_counter_label,
            width=10, fg=self.LABEL_FG, font=self.LABEL_FONT, bg=self.LABEL_BG,
            relief='raised').grid(row=0, column=1, rowspan=2, sticky='news')

        tk.Button(self.main_frame, text="MINUS", command=self.minus,
            height=5, width=10).grid(row=0, column=2, sticky='news')

        tk.Button(self.main_frame, text="MINUS10", command=self.minus10,
            height=5, width=10).grid(row=1, column=2, sticky='news')

    def plus(self, event=None):
        self.update_counter(0.1)
        
    def minus(self, event=None):
        self.update_counter(-0.1)
        
    def plus10(self, event=None):
        self.update_counter(10.0)
        
    def minus10(self, event=None):
        self.update_counter(-10)
        
    def update_counter(self, value):
        self.counter += value
        self.var_counter_label.set("{:.1f}".format(self.counter))

        
def main():
    main_win = tk.Tk()
    main_win.title(APP_TITLE)
    main_win.configure(background="#2D2D2D")
    main_win.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
    main_win.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
    
    app = Application(main_win)
    
    main_win.mainloop()
 
 
if __name__ == '__main__':
    main()
N.B: Tkinter ist sicher schon ein wenig in die Jahre gekommen. Selbstverständlich kann sein grafisches Aussehen durch eigene Einflussnahme noch um etliche Jahre zurückversetzt werden.

Gruss wuf :-)
Take it easy Mates!
rattionline
User
Beiträge: 2
Registriert: Samstag 10. März 2018, 14:46

@wuf Vielen Dank für deine Mühe es um zu schreiben!!
Ich habe programmieren leider nie gelernt und habe mir alles selbst angeeignet.
Mit Class habe ich bis jetzt noch nicht gearbeitet werde es aber mal beibehalten allein schon weil der Zähler jetzt funktioniert :)
Das ganze war nur ein ganz grobes Design um die Funktionen zu testen, aber ja du hast recht das sieht schon sehr mittelalterlich aus :D

Besten Dank nochmal
Antworten