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