[Python] J'ai essayé de faire une application qui calcule le salaire en fonction des heures de travail avec tkinter

Contexte

Je suis nouveau sur python. J'ai vu un article disant: "Comme il est facile de faire une minuterie avec python, je recommande une minuterie pour les débutants!", J'ai donc décidé de l'avaler et de faire une minuterie. Ce n'est pas amusant de simplement mesurer le temps, nous allons donc ajouter une fonction qui "Si vous définissez un salaire horaire, le salaire sera calculé en fonction des heures de travail".

Fonctions que vous souhaitez ajouter

--Histoire liée

environnement

Ce que j'ai réellement fait

Onglet de l'écran principal

2020-06-02.png L'écran au démarrage ressemble à ceci.

2020-06-02 (1).png Lorsque vous appuyez sur le bouton «Démarrer», la minuterie démarre et le bouton «Démarrer» se transforme en bouton «Pause».

2020-06-02 (2).png Lorsque vous appuyez sur le bouton «Pause», le minuteur s'arrête et passe au bouton «Reprendre».

Lorsque vous appuyez sur le bouton «Terminer», le temps de la minuterie est enregistré et le salaire est calculé en utilisant le salaire horaire réglé. Appuyez sur le bouton "Réinitialiser" pour revenir à l'état avant le démarrage de la minuterie sans calculer le salaire. En passant, si vous appuyez sur ces boutons alors que le minuteur ne fonctionne pas, rien ne se passe.

2020-06-02 (3).png Pour éviter les clics accidentels, une fenêtre de confirmation comme celle-ci s'affiche lorsque vous appuyez sur les boutons «Terminer» et «Réinitialiser».

2020-06-02 (5).png Lorsque vous appuyez sur le bouton «Retrait de paiement», une fenêtre de confirmation sera à nouveau émise pour retirer le salaire (remplacez «Paiement: ○ Yen» par «Paiement: 0 Yen»).

Onglet Enregistrement

image.png Sur l'onglet "Enregistrer", vous pouvez voir l'historique du minuteur. Par exemple, «06/02 00: 12-00: 14 00:08» en haut est «Appuyez sur le bouton de démarrage à 00:12 le 6/2 et appuyez sur le bouton de fin à 00:14. Minuterie à la fin La notation de est 00:08 ".

J'ai ajouté cette fonction d'histoire parce que je voulais savoir quand je pouvais le plus me concentrer.

image.png Chaque élément peut être sélectionné de cette manière et peut être supprimé avec le bouton "Supprimer". Vous pouvez supprimer tous les éléments avec le bouton "Supprimer tout".

Onglet d'enregistrement du tiroir

image.png Vous pouvez voir l'enregistrement de retrait de salaire.

Onglet Paramètres

image.png Vous pouvez vérifier / réinitialiser le total des heures de travail et modifier le salaire horaire.

1591025774093.jpg Si vous entrez une valeur autre qu'une valeur entière dans la colonne du salaire horaire, une fenêtre d'erreur apparaîtra et le salaire horaire ne sera pas modifié.

Code source

app.py


#-*-coding: utf-8 -*-
import tkinter as tk
from tkinter import ttk,messagebox
from time import time
import datetime
import pickle

class Application(tk.Frame):
    def __init__(self, master=None): 
        super().__init__(master)
        self.pack()

        master.title("Gestion des présences")
        master.geometry("350x170")
        
        #Réglage de la valeur initiale
        self.wage = 1000 #Salaire horaire
        self.have_money = 0 #Un salaire
        self.total = 0 #Durée totale (secondes) de la minuterie en cours d'exécution
        self.record_list = [] #Enregistrer l'heure de la minuterie
        self.money_record_list = [] #Registre de retrait de salaire

        self.data_list = [self.wage,self.have_money,self.record_list,self.money_record_list,self.total]
        
        #Chargement des données
        self.load_data()

        #Créer des onglets et des contenus
        self.create_tabs()
        self.create_main(self.main)
        self.create_record(self.record)
        self.create_history(self.history)
        self.create_setting(self.setting)


    #Créer un onglet/Installation
    def create_tabs(self):
        self.notebook = tk.ttk.Notebook()
        self.main = tk.Frame(self.notebook)
        self.setting = tk.Frame(self.notebook)
        self.history = tk.Frame(self.notebook)
        self.record = tk.Frame(self.notebook)
        self.notebook.add(self.main, text="Écran principal")
        self.notebook.add(self.record, text="Record")
        self.notebook.add(self.history, text="Dossier de retrait")
        self.notebook.add(self.setting, text="Réglage")
        self.notebook.pack(expand=True, fill="both")

    #Onglet "Écran principal"
    def create_main(self,master):
        lb_1 = tk.Label(master, text="Heures d'ouverture")
        lb_1.place(x=10, y=0)
        self.canvas = tk.Canvas(master,width=290,height=80)
        self.canvas.place(x=10,y=20)

        self.spbt = tk.Button(master,text="début",command=self.start_pause_button,width=10)
        self.spbt.place(x=250, y=20)
        tk.Button(master,text="Terminé",command=self.stop_button_click,width=10).place(x=250, y=50)
        tk.Button(master,text="réinitialiser",command=self.reset_button_click,width=10).place(x=250, y=80)
        tk.Button(master,text="Retrait de salaire",command=self.withdraw,width=10).place(x=10, y=115)
        
        self.wage_var = tk.StringVar()
        lb_2 = tk.Label(master,textvariable=self.wage_var)
        self.wage_var.set("Salaire horaire: {0}Cercle".format(self.wage))
        lb_2.place(x=10, y=90)
        self.money_var = tk.StringVar()
        lb_3 = tk.Label(master, textvariable=self.money_var)
        self.money_var.set("Un salaire: {0}Cercle".format(int(self.have_money)))
        lb_3.place(x=100, y=90)

        self.stop_time = 0.0
        self.elapsed_time = 0.0 #Temps de mesure actuel (temps affiché sur le minuteur) (secondes)
        self.timer_running = False #Vrai si le minuteur est en cours d'exécution, Faux s'il est arrêté

        master.after(50,self.update)

    #Onglet "Enregistrer"
    def create_record(self,master):
        self.record_lb = tk.Listbox(master,width=42,height=8)
        self.record_lb.place(x=0,y=0)
        self.record_load() #Sortie de l'enregistrement sauvegardé dans le fichier dat

        tk.Button(master,text="Effacer",command=self.del_record,width=10).place(x=260, y=0) #データを1件Effacer
        tk.Button(master,text="Tout supprimer",command=self.del_all_records,width=10).place(x=260, y=30) #Supprimer toutes les données

    #Onglet "Enregistrement de retrait"
    def create_history(self,master):
        self.money_record_lb = tk.Listbox(master,width=42,height=8)
        self.money_record_lb.place(x=0,y=0)
        self.money_record_load() #Sortie de l'enregistrement de retrait enregistré dans le fichier dat

        tk.Button(master,text="Effacer",command=self.del_money_record,width=10).place(x=260, y=0) #データ1件Effacer
        tk.Button(master,text="Tout supprimer",command=self.del_all_money_records,width=10).place(x=260, y=30) #Supprimer toutes les données

    #Onglet "Paramètres"
    def create_setting(self,master):
        #Changement de salaire horaire
        lb_1 = tk.Label(master, text="· Salaire horaire")
        lb_1.place(x=5,y=3)
        value = tk.StringVar()
        value.set(self.wage)
        self.wage_sp = tk.Spinbox(master,textvariable=value,from_=0,to=100000000,width=8,increment=50)
        self.wage_sp.place(x=50,y=6)
        tk.Button(master,text="Changement",command=self.chg_wage,width=5).place(x=120, y=2)

        #Réinitialiser le temps de travail total
        self.total_var = tk.StringVar()
        lb_2 = tk.Label(master, textvariable=self.total_var)
        self.str_total = self.strtime(self.total)
        self.total_var.set("・ Temps de travail total{0}".format(self.str_total))
        lb_2.place(x=5,y=40)
        tk.Button(master,text="réinitialiser",command=self.reset_total_click,width=5).place(x=135, y=35)



    #début/Lorsque le bouton pause est enfoncé
    def start_pause_button(self):
        if self.timer_running:
            self.pause_timer()
            self.spbt["text"] = "Reprendre"
        else:
            #Obtenez l'heure à laquelle vous appuyez sur "Démarrer" au lieu de "Reprendre"
            if not self.elapsed_time:
                self.dt_start = datetime.datetime.now() #Obtenir l'heure de début de la minuterie (pour enregistrer comme enregistrement)
            self.start_timer()
            self.spbt["text"] = "pause"

    #Démarrage de la minuterie
    def start_timer(self):
        if not self.timer_running:
            self.start_time = time() - self.elapsed_time
            self.timer_running = True

    #Pause de la minuterie
    def pause_timer(self):
        if self.timer_running:
            self.stop_time = time() - self.start_time #Affichage de l'heure de la minuterie lorsque le bouton de pause est enfoncé
            self.timer_running = False

    #Lorsque le bouton Terminé est enfoncé
    def stop_button_click(self):
        if self.elapsed_time:
            msgbox = messagebox.askyesno("Vérification","Êtes-vous sûr de vouloir terminer l'enregistrement?")
            if msgbox:
                self.start_time = time()
                self.add_wage()
                self.add_total()
                self.dt_stop = datetime.datetime.now()
                self.new_record()
                self.spbt["text"] = "début"
                self.stop_time = 0.0
                self.elapsed_time = 0.0
                self.timer_running = False
                self.save_data()

    #Lorsque le bouton de réinitialisation est enfoncé
    def reset_button_click(self):
        if self.elapsed_time:
            msgbox = messagebox.askyesno("Vérification","Voulez-vous réinitialiser le chronomètre?")
            if msgbox:
                self.spbt["text"] = "début"
                self.resettimer()

    #Réinitialisation de la minuterie
    def resettimer(self):
        self.start_time = time()
        self.stop_time = 0.0
        self.elapsed_time = 0.0
        self.timer_running = False

    #Mettre à jour l'heure du minuteur
    def update(self):
        self.canvas.delete("time")
        if self.timer_running:
            self.elapsed_time = time() - self.start_time
            elapsed_time_str = self.strtime(self.elapsed_time)
            self.canvas.create_text(200,40,text=elapsed_time_str,font=("Helvetica",40,"bold"),fill="black",tag="time",anchor="e")
        else:
            stop_time_str = self.strtime(self.stop_time)
            self.canvas.create_text(200,40,text=stop_time_str,font=("Helvetica",40,"bold"),fill="black",tag="time",anchor="e")
        
        self.master.after(50,self.update)

    #Ajouter un salaire lorsque la minuterie s'arrête
    def add_wage(self):
        self.have_money += int(self.wage) * self.elapsed_time / 3600
        self.money_var.set("Un salaire: {0}Cercle".format(int(self.have_money)))



    #Enregistrer l'enregistrement précédent
    def new_record(self):
        start_date = self.dt_start.strftime("%m/%d")
        start_time = self.dt_start.strftime("%H:%M")
        stop_time = self.dt_stop.strftime("%H:%M")
        elapsed_time = self.strtime(self.elapsed_time)
        str_record = "{0}    {1}~{2}    {3}".format(start_date,start_time,stop_time,elapsed_time)
        self.record_lb.insert(0,str_record)
        self.record_list.insert(0,str_record)

    #Supprimer l'enregistrement (1 cas)
    def del_record(self):
        index = self.record_lb.curselection()
        if index:
            msgbox = messagebox.askyesno("Vérification","Voulez-vous vraiment supprimer l'enregistrement sélectionné?")
            if msgbox:
                self.record_lb.delete(int(index[0]))
                self.record_list.pop(int(index[0]))
                self.record_lb.select_set(int(index[0])-1)
                self.save_data()
                
    #Supprimer tous les enregistrements
    def del_all_records(self):
        print(self.record_lb.size())
        if self.record_lb.size() != 0:
            msgbox = messagebox.askyesno("Vérification","Êtes-vous sûr de vouloir supprimer tous les enregistrements?")
            if msgbox:
                self.record_lb.delete(0,tk.END)
                self.record_list.clear()
                self.save_data()

    #Retrait de salaire
    def withdraw(self):
        if self.have_money:
            msgbox = messagebox.askyesno("Vérification","Voulez-vous retirer votre salaire?")
            if msgbox:
                self.dt_wd = datetime.datetime.now()
                self.add_money_record()
                self.have_money = 0
                self.money_var.set("Un salaire: {0}Cercle".format(int(self.have_money)))
                self.save_data()

    #Ajout du précédent enregistrement de retrait de salaire
    def add_money_record(self):
        wd_time = self.dt_wd.strftime("%m/%d  %H:%M")
        record_money = int(self.have_money)
        str_money_record = "{0}    -{1}Cercle".format(wd_time,record_money)
        self.money_record_lb.insert(0,str_money_record)
        self.money_record_list.insert(0,str_money_record)
    
    #Supprimer l'enregistrement de retrait (1 cas)
    def del_money_record(self):
        index = self.money_record_lb.curselection()
        if index:
            msgbox = messagebox.askyesno("Vérification","Voulez-vous vraiment supprimer l'enregistrement sélectionné?")
            if msgbox:
                self.money_record_lb.delete(int(index[0]))
                self.money_record_list.pop(int(index[0]))
                self.money_record_lb.select_set(int(index[0])-1)
                self.save_data()

    #Supprimer tous les enregistrements de retrait
    def del_all_money_records(self):
         if self.money_record_lb.size() != 0:
            msgbox = messagebox.askyesno("Vérification","Êtes-vous sûr de vouloir supprimer tous les enregistrements?")
            if msgbox:
                self.money_record_lb.delete(0,tk.END)
                self.money_record_list.clear()
                self.save_data()



    #Changement de salaire horaire
    def chg_wage(self):
        if self.wage_sp.get().isnumeric():
            self.wage = self.wage_sp.get()
            self.wage_var.set("Salaire horaire: {0}Cercle".format(self.wage))
            self.save_data()
        else:
            messagebox.showinfo("Erreur","Veuillez saisir le salaire horaire sous forme de valeur entière")

    #Mettre à jour le nombre total d'heures de travail
    def add_total(self):
        self.total += self.elapsed_time
        self.str_total = self.strtime(self.total)
        self.total_var.set("・ Temps de travail total{0}".format(self.str_total))

    #Lorsque le bouton de réinitialisation du temps de travail total est enfoncé
    def reset_total_click(self):
        if self.total:
            msgbox = messagebox.askyesno("Vérification","Voulez-vous réinitialiser le temps de travail total?")
            if msgbox:
                self.total = 0
                self.str_total = self.strtime(self.total)
                self.total_var.set("・ Temps de travail total{0}".format(self.str_total))
                self.save_data()



    #self.record_lb de charge
    def record_load(self):
        if self.record_lb.size() == 0:
            for i in self.record_list:
                self.record_lb.insert(tk.END,i) #Enregistrement de liste_Liste des éléments de l'enregistrement de zone de liste_insérer dans lb

    #self.money_record_lb de charge
    def money_record_load(self):
        if self.money_record_lb.size() == 0:
            for i in self.money_record_list:
                self.money_record_lb.insert(tk.END,i) #Argent de liste_record_Liste des éléments de l'argent de la zone de liste_record_insérer dans lb

    #Obtenez des données
    def load_data(self):
        with open("log.dat","rb") as fp:
            load_list = pickle.load(fp)
            count = 0
            for i in load_list:
                self.data_list[count] = i
                count += 1
        
        self.wage = self.data_list[0]
        self.have_money = self.data_list[1]
        self.record_list = self.data_list[2]
        self.money_record_list = self.data_list[3]
        self.total = self.data_list[4]

    #Stockage de données
    def save_data(self):
        data_list = [self.wage,self.have_money,self.record_list,self.money_record_list,self.total]
        with open("log.dat","wb") as fp:
            pickle.dump(data_list,fp)




    #Heure h:mm:Convertir en type str sous la forme de ss
    def strtime(self,time):
        hour = int(time / 3600)
        min = int((time / 60) % 60)
        sec =int(time % 60)

        if hour == 0:
            if min < 10:
                if sec < 10:
                    strtime = "0{min}:0{sec}".format(min=min,sec=sec)
                else:
                    strtime = "0{min}:{sec}".format(min=min,sec=sec)
            else:
                if sec < 10:
                    strtime = "{min}:0{sec}".format(min=min,sec=sec)
                else:
                    strtime = "{min}:{sec}".format(min=min,sec=sec)
        else:
            if min < 10:
                if sec < 10:
                    strtime = "{hour}:0{min}:0{sec}".format(hour=hour,min=min,sec=sec)
                else:
                    strtime = "{hour}:0{min}:{sec}".format(hour=hour,min=min,sec=sec)
            else:
                if sec < 10:
                    strtime = "{hour}:{min}:0{sec}".format(hour=hour,min=min,sec=sec)
                else:
                    strtime = "{hour}:{min}:{sec}".format(hour=hour,min=min,sec=sec)

        return strtime


def main():
    root = tk.Tk()
    root.resizable(width=False, height=False) 
    app = Application(master=root)
    app.mainloop()

if __name__ == "__main__":
    main()

Essayez d'utiliser cette application

Ça fait du bien.

J'ai fixé le salaire horaire à 300 yens et j'utilise la règle selon laquelle je peux utiliser les heures de travail x 300 yens comme passe-temps. Si vous travaillez pendant 5 heures, vous pouvez aller dans un café de dessin animé pendant 8 heures! Faire! !! !! Je dois étudier pendant 20 heures pour acheter un nouveau jeu! !! Faire! !! !! Cela aide à maintenir la motivation.

finalement

Cela ne fait que peu de temps que j'ai commencé à toucher python, et je pense qu'il y a une place dans le code qui dit "c'est mieux". Je voudrais l'utiliser pour une étude future, donc si vous remarquez une telle chose, je vous serais reconnaissant si vous pouviez me le faire savoir dans les commentaires.

Recommended Posts

[Python] J'ai essayé de faire une application qui calcule le salaire en fonction des heures de travail avec tkinter
J'ai essayé de créer une application OCR avec PySimpleGUI
J'ai fait une application d'envoi de courrier simple avec tkinter de Python
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
J'ai essayé de créer une application todo en utilisant une bouteille avec python
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
J'ai essayé de créer un langage original "PPAP Script" qui imagé PPAP (Pen Pineapple Appo Pen) avec Python
J'ai essayé d'implémenter le perceptron artificiel avec python
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai fait un chronomètre en utilisant tkinter avec python
[1 hour challenge] J'ai essayé de créer un site de bonne aventure qui soit trop adapté à Python
J'ai essayé de créer un générateur qui génère une classe conteneur C # à partir de CSV avec Python
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de faire une activité qui définit collectivement les informations de position
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[Python] Japonais simple ⇒ J'ai essayé de créer un outil de traduction en anglais
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai créé un capteur d'ouverture / fermeture (lien Twitter) avec TWE-Lite-2525A
[AWS] [GCP] J'ai essayé de rendre les services cloud faciles à utiliser avec Python
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
[Zaif] J'ai essayé de faciliter le commerce de devises virtuelles avec Python
Je veux faire un jeu avec Python
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé de détecter un objet avec M2Det!
J'ai essayé d'automatiser la fabrication des sushis avec python
J'ai essayé d'envoyer un email avec SendGrid + Python
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
[Analyse des brevets] J'ai essayé de créer une carte des brevets avec Python sans dépenser d'argent
[Python] J'ai essayé de créer une IA Shiritori qui améliore le vocabulaire grâce aux batailles
J'ai essayé de faire la reconnaissance de caractères manuscrits de Kana Partie 3/3 Coopération avec l'interface graphique en utilisant Tkinter
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé de démarrer avec le script python de blender_Part 01
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
Suite ・ J'ai essayé de créer Slackbot après avoir étudié Python3
J'ai essayé de démarrer avec le script python de blender_Partie 02
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé de trouver la classe alternative avec tensorflow
Faire une application utilisant tkinter un fichier exécutable avec cx_freeze
J'ai essayé de résoudre la théorie des nombres entiers d'AOJ avec Python
J'ai essayé de faire une simulation de séparation de source sonore en temps réel avec l'apprentissage automatique Python
[Mac] Je souhaite créer un serveur HTTP simple qui exécute CGI avec Python
J'ai essayé de créer un environnement d'apprentissage automatique avec Python (Mac OS X)
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
J'ai essayé de simuler la propagation de l'infection avec Python