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".
lié à la minuterie
Minuterie qui peut être déplacée avec les boutons "Démarrer", "Pause" et "Terminé" --Calculer le salaire à partir du salaire horaire et du temps de la minuterie --Réinitialisez la minuterie en cours (pour éviter un salaire supplémentaire si vous appuyez accidentellement sur le bouton de démarrage)
lié à l'argent
Changement de salaire horaire
Réinitialiser le salaire
--Histoire liée
L'écran au démarrage ressemble à ceci.
Lorsque vous appuyez sur le bouton «Démarrer», la minuterie démarre et le bouton «Démarrer» se transforme en bouton «Pause».
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.
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».
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»).
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.
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".
Vous pouvez voir l'enregistrement de retrait de salaire.
Vous pouvez vérifier / réinitialiser le total des heures de travail et modifier le salaire horaire.
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é.
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()
Ç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.
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