У меня возникла проблема с созданием графического интерфейса Tkinter, который рассчитывает, сколько денег вы бы заработали за данный момент. Это просто секундомер с кнопкой запуска и остановки. Когда вы запустите секундомер, вы увидите рядом с секундомером, сколько денег вы бы заработали за заданное время на секундомере. Что я не могу сделать, так это часть расчета денег. Все работает нормально, пока денежный калькулятор не превратится в 00998 евро, и ему придется добавить 1 евро к переменной евро и изменить центы на 0. Я хочу, чтобы он добавил 1 евро и не изменил центов на 0, когда центы равны 998 центов и снова начните добавлять центы, пока он не станет равным 998 и т. д. Но то, что мой код делает сейчас, - это когда центы равны 998 центам, он начинает добавлять больше евро, чем 1, и вся этикетка начинает дрожать.

import tkinter as tk
import tkinter.font as font
import time

euro = 0
cent = 0
hcent = 0
salaris = (7.2/3600)
class Timer:
    def __init__(self):
        self.root = tk.Tk()
        self.text_variabel = tk.StringVar()
        self.root.geometry('455x300')
        self.root.resizable(False,False)
        self.root.configure(bg='lightgreen')
        self.start_tijd = None
        self.is_running = False

        self.make_widgets()
        self.root.bind('<Return>', self.startstop)
        self.root.mainloop()

    def make_widgets(self):
        tk.Label(self.root, textvariable=self.text_variabel, font='ariel 30', fg='white', bg='lightgreen').pack()
        #tk.Label(self.root, textvariable=self.text_variabel, font='ariel 15', fg='green', bg='black').pack()
        btn_frame = tk.Frame(self.root)
        btn_frame.pack()
        tk.Button(btn_frame, text='Start', command=self.start, font=font.Font(size=25, family='Helvetica'), width=6).pack(side=tk.LEFT)
        tk.Button(btn_frame, text='Stop', command=self.stop, font=font.Font(size=25, family='Helvetica'), width=6).pack(side=tk.RIGHT)

    def start(self):
        if not self.is_running:
            self.start_tijd = time.time()
            self.timer()
            #self.money()
            self.is_running = True

    def timer(self):
        self.text_variabel.set(self.format_time(time.time() - self.start_tijd))
        self.after_loop = self.root.after(50, self.timer)

    def stop(self):
        if self.is_running:
            self.root.after_cancel(self.after_loop)
            self.is_running = False

    def startstop(self, event=None):
        if self.is_running:
            self.stop()
        else:
            self.start()

    @staticmethod
    def format_time(elap):
        global cent, hcent, euro, salaris
        hours = int(elap / 3600)
        minutes = int(elap / 60 - hours * 60.0)
        seconds = int(elap - hours * 3600.0 - minutes * 60.0)
        hseconds = int((elap - hours * 3600.0 - minutes * 60.0 - seconds) * 10)
        #euro = int(0)
        #secondes_grens = 10 or 20 or 30 or 50 or 59
        #cent = int(0)

        #hcent = (seconds * salaris)*1000
        ksalaris = salaris * 1000
        while True:
            if cent <=996:
                cent = (seconds * ksalaris) + (minutes * ksalaris)*60 + (hours * ksalaris)*3600
                #elif hours > 0 and seconds == 0:
                #elif hours ==1:
                 #   cent = (hours * salaris)*100000
                #elif hours > 0 and seconds > 0:
                 #   cent = (seconds * salaris)*1000 + (hours * salaris)*100000
            else:
                euro = euro + 1
                cent = 0
            return '%02d:%02d:%02d:%1d' % (hours, minutes, seconds, hseconds), '€%02d,%03d' % (euro, cent)


Timer()
0
saïd alhazina 14 Фев 2021 в 02:46

2 ответа

Лучший ответ

Вы забываете, что между первой минутой и первым часом много минут.

Вам нужны все эти if предложения? Или у вас может быть простой аккумулятор секунд, минут, часов?

ksalaris = salaris * 1000
while True:
  if cent <= 996:
    cent = (seconds * ksalaris) + (minutes * ksalaris)*60 + (hours * ksalaris)*3600
  else:
    euro = euro + 1
    cent = 0
3
Nic3500 14 Фев 2021 в 02:00

Либо разделите результат на составные части (требуется import math):

    cents = (seconds * ksalaris) + (minutes * ksalaris)*60 + (hours * ksalaris)*3600
    cent, euro = math.modf(cents)
    cent = int(cent*1000)
    return '%02d:%02d:%02d:%1d' % (hours, minutes, seconds, hseconds), '€%02d,%03d' % (euro, cent)

Или
используйте форматирование с плавающей запятой (возможно, вам придется объявить языковой стандарт, чтобы получить (запятую) в качестве разделителя.

cents = (seconds * ksalaris) + (minutes * ksalaris)*60 + (hours * ksalaris)*3600
return '%02d:%02d:%02d:%1d' % (hours, minutes, seconds, hseconds), '€%05.3f' % (cents)
0
Rolf of Saxony 14 Фев 2021 в 11:30
66191098