Ich bin neu in Python. Ich sah einen Artikel, in dem stand: "Da man mit Python leicht einen Timer erstellen kann, empfehle ich einen Timer für Anfänger!". Also beschloss ich, ihn zu schlucken und einen Timer zu erstellen. Es macht keinen Spaß, nur die Zeit zu messen. Deshalb fügen wir eine Funktion hinzu: "Wenn Sie einen Stundenlohn festlegen, wird der Lohn anhand der Arbeitszeit berechnet."
--Timer bezogen --Timer, der mit den Tasten "Start", "Pause" und "Fertig" verschoben werden kann --Berechnen Sie das Gehalt aus dem Stundenlohn und der Zeitschaltuhr --Stellen Sie den laufenden Timer zurück (um ein zusätzliches Gehalt zu vermeiden, wenn Sie versehentlich die Starttaste drücken)
Geld im Zusammenhang
Änderung des Stundenlohns
Gehalt zurücksetzen
Geschichte im Zusammenhang --Timer-Aktivierungsverlauf (Startdatum und -zeit, Enddatum und -zeit, Timer-Zeit)
↑ Löschen Sie diesen Verlauf (1 / alle)
Anzeige der Gesamtarbeitszeit
Der Bildschirm beim Start sieht folgendermaßen aus.
Wenn Sie die Taste "Start" drücken, startet der Timer und die Taste "Start" wechselt in die Taste "Pause".
Wenn Sie die Taste "Pause" drücken, pausiert der Timer und wechselt zur Taste "Resume".
Wenn Sie auf die Schaltfläche "Fertig stellen" klicken, wird die Timer-Zeit aufgezeichnet und das Gehalt anhand des festgelegten Stundenlohns berechnet. Drücken Sie die Taste "Zurücksetzen", um zum Status zurückzukehren, bevor der Timer gestartet wurde, ohne das Gehalt zu berechnen. Übrigens passiert nichts, wenn Sie diese Tasten drücken, während der Timer nicht läuft.
Um versehentliche Klicks zu vermeiden, wird ein Bestätigungsfenster wie dieses angezeigt, wenn die Tasten "Fertig stellen" und "Zurücksetzen" gedrückt werden.
Wenn Sie auf die Schaltfläche "Zahlungsabhebung" klicken, wird erneut ein Bestätigungsfenster zum Abheben des Gehalts angezeigt (ändern Sie "Zahlung: ○ Yen" in "Zahlung: 0 Yen").
Auf der Registerkarte "Aufnahme" können Sie den Verlauf des Timers anzeigen. Beispiel: "06/02 00: 12-00: 14 00:08" oben ist "Drücken Sie die Starttaste um 00:12 Uhr am 02.06. Und drücken Sie die Zieltaste um 00:14 Uhr. Timer nach Abschluss Die Notation von ist 00:08 ".
Ich habe diese Verlaufsfunktion hinzugefügt, weil ich wissen wollte, wann ich mich am meisten konzentrieren kann.
Jedes Element kann auf diese Weise ausgewählt und mit der Schaltfläche "Löschen" gelöscht werden. Sie können alle Elemente mit der Schaltfläche "Alle löschen" löschen.
Sie können den Gehaltsabhebungsdatensatz sehen.
Sie können die Gesamtarbeitszeit überprüfen / zurücksetzen und den Stundenlohn ändern.
Wenn Sie in der Spalte Stundenlohn einen anderen Wert als einen ganzzahligen Wert eingeben, wird ein Fehlerfenster angezeigt und der Stundenlohn wird nicht geändert.
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("Anwesenheitsmanagement")
master.geometry("350x170")
#Anfangswerteinstellung
self.wage = 1000 #Stundenlohn
self.have_money = 0 #Gehalt
self.total = 0 #Gesamtzeit (Sekunden) des aktuell laufenden Timers
self.record_list = [] #Rekordzeit des Timers
self.money_record_list = [] #Gehaltsabhebungsprotokoll
self.data_list = [self.wage,self.have_money,self.record_list,self.money_record_list,self.total]
#Lade Daten
self.load_data()
#Erstellen Sie Registerkarten und Inhalte
self.create_tabs()
self.create_main(self.main)
self.create_record(self.record)
self.create_history(self.history)
self.create_setting(self.setting)
#Registerkarte erstellen/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="Hauptbildschirm")
self.notebook.add(self.record, text="Aufzeichnung")
self.notebook.add(self.history, text="Auszahlungsprotokoll")
self.notebook.add(self.setting, text="Aufbau")
self.notebook.pack(expand=True, fill="both")
#Registerkarte "Hauptbildschirm"
def create_main(self,master):
lb_1 = tk.Label(master, text="Arbeitszeit")
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="Start",command=self.start_pause_button,width=10)
self.spbt.place(x=250, y=20)
tk.Button(master,text="Erledigt",command=self.stop_button_click,width=10).place(x=250, y=50)
tk.Button(master,text="zurücksetzen",command=self.reset_button_click,width=10).place(x=250, y=80)
tk.Button(master,text="Gehaltsabhebung",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("Stundenlohn: {0}Kreis".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("Gehalt: {0}Kreis".format(int(self.have_money)))
lb_3.place(x=100, y=90)
self.stop_time = 0.0
self.elapsed_time = 0.0 #Aktuelle Messzeit (auf dem Timer angezeigte Zeit) (Sekunden)
self.timer_running = False #True, wenn der Timer läuft, False, wenn er gestoppt ist
master.after(50,self.update)
#Registerkarte "Aufnahme"
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() #Geben Sie den in der Datendatei gespeicherten Datensatz aus
tk.Button(master,text="Löschen",command=self.del_record,width=10).place(x=260, y=0) #データを1件Löschen
tk.Button(master,text="Alles löschen",command=self.del_all_records,width=10).place(x=260, y=30) #Löschen Sie alle Daten
#Registerkarte "Auszahlungsdatensatz"
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() #Geben Sie den in der Datendatei gespeicherten Auszahlungsdatensatz aus
tk.Button(master,text="Löschen",command=self.del_money_record,width=10).place(x=260, y=0) #データ1件Löschen
tk.Button(master,text="Alles löschen",command=self.del_all_money_records,width=10).place(x=260, y=30) #Löschen Sie alle Daten
#Registerkarte "Einstellungen"
def create_setting(self,master):
#Änderung des Stundenlohns
lb_1 = tk.Label(master, text="· Stundenlohn")
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="Veränderung",command=self.chg_wage,width=5).place(x=120, y=2)
#Gesamtarbeitszeit zurücksetzen
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("・ Gesamtarbeitszeit{0}".format(self.str_total))
lb_2.place(x=5,y=40)
tk.Button(master,text="zurücksetzen",command=self.reset_total_click,width=5).place(x=135, y=35)
#Start/Wenn die Pause-Taste gedrückt wird
def start_pause_button(self):
if self.timer_running:
self.pause_timer()
self.spbt["text"] = "Fortsetzen"
else:
#Holen Sie sich die Zeit, wenn Sie "Start" anstelle von "Fortsetzen" drücken.
if not self.elapsed_time:
self.dt_start = datetime.datetime.now() #Startzeit des Timers abrufen (als Datensatz speichern)
self.start_timer()
self.spbt["text"] = "Pause"
#Timer starten
def start_timer(self):
if not self.timer_running:
self.start_time = time() - self.elapsed_time
self.timer_running = True
#Timer Pause
def pause_timer(self):
if self.timer_running:
self.stop_time = time() - self.start_time #Zeigt die Zeit des Timers an, wenn die Pause-Taste gedrückt wird
self.timer_running = False
#Wenn die Fertig-Taste gedrückt wird
def stop_button_click(self):
if self.elapsed_time:
msgbox = messagebox.askyesno("Bestätigung","Möchten Sie die Aufnahme wirklich abschließen?")
if msgbox:
self.start_time = time()
self.add_wage()
self.add_total()
self.dt_stop = datetime.datetime.now()
self.new_record()
self.spbt["text"] = "Start"
self.stop_time = 0.0
self.elapsed_time = 0.0
self.timer_running = False
self.save_data()
#Wenn die Reset-Taste gedrückt wird
def reset_button_click(self):
if self.elapsed_time:
msgbox = messagebox.askyesno("Bestätigung","Möchten Sie die Stoppuhr zurücksetzen?")
if msgbox:
self.spbt["text"] = "Start"
self.resettimer()
#Timer zurückgesetzt
def resettimer(self):
self.start_time = time()
self.stop_time = 0.0
self.elapsed_time = 0.0
self.timer_running = False
#Timer-Zeit aktualisieren
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)
#Fügen Sie das Gehalt hinzu, wenn der Timer stoppt
def add_wage(self):
self.have_money += int(self.wage) * self.elapsed_time / 3600
self.money_var.set("Gehalt: {0}Kreis".format(int(self.have_money)))
#Notieren Sie den vorherigen Datensatz
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)
#Datensatz löschen (1 Fall)
def del_record(self):
index = self.record_lb.curselection()
if index:
msgbox = messagebox.askyesno("Bestätigung","Möchten Sie den ausgewählten Datensatz wirklich löschen?")
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()
#Löschen Sie alle Datensätze
def del_all_records(self):
print(self.record_lb.size())
if self.record_lb.size() != 0:
msgbox = messagebox.askyesno("Bestätigung","Möchten Sie wirklich alle Datensätze löschen?")
if msgbox:
self.record_lb.delete(0,tk.END)
self.record_list.clear()
self.save_data()
#Gehaltsabhebung
def withdraw(self):
if self.have_money:
msgbox = messagebox.askyesno("Bestätigung","Möchten Sie Ihr Gehalt abheben?")
if msgbox:
self.dt_wd = datetime.datetime.now()
self.add_money_record()
self.have_money = 0
self.money_var.set("Gehalt: {0}Kreis".format(int(self.have_money)))
self.save_data()
#Vorheriger Gehaltsabhebungsdatensatz hinzugefügt
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}Kreis".format(wd_time,record_money)
self.money_record_lb.insert(0,str_money_record)
self.money_record_list.insert(0,str_money_record)
#Auszahlungsdatensatz löschen (1 Fall)
def del_money_record(self):
index = self.money_record_lb.curselection()
if index:
msgbox = messagebox.askyesno("Bestätigung","Möchten Sie den ausgewählten Datensatz wirklich löschen?")
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()
#Löschen Sie alle Auszahlungsdatensätze
def del_all_money_records(self):
if self.money_record_lb.size() != 0:
msgbox = messagebox.askyesno("Bestätigung","Möchten Sie wirklich alle Datensätze löschen?")
if msgbox:
self.money_record_lb.delete(0,tk.END)
self.money_record_list.clear()
self.save_data()
#Änderung des Stundenlohns
def chg_wage(self):
if self.wage_sp.get().isnumeric():
self.wage = self.wage_sp.get()
self.wage_var.set("Stundenlohn: {0}Kreis".format(self.wage))
self.save_data()
else:
messagebox.showinfo("Error","Bitte geben Sie den Stundenlohn als ganzzahligen Wert ein")
#Aktualisieren Sie die Gesamtarbeitszeit
def add_total(self):
self.total += self.elapsed_time
self.str_total = self.strtime(self.total)
self.total_var.set("・ Gesamtarbeitszeit{0}".format(self.str_total))
#Wenn die Reset-Taste für die Gesamtarbeitszeit gedrückt wird
def reset_total_click(self):
if self.total:
msgbox = messagebox.askyesno("Bestätigung","Möchten Sie die Gesamtarbeitszeit zurücksetzen?")
if msgbox:
self.total = 0
self.str_total = self.strtime(self.total)
self.total_var.set("・ Gesamtarbeitszeit{0}".format(self.str_total))
self.save_data()
#self.record_lb Last
def record_load(self):
if self.record_lb.size() == 0:
for i in self.record_list:
self.record_lb.insert(tk.END,i) #Datensatz auflisten_Listenelemente des Listenfelddatensatzes auf_in lb einfügen
#self.money_record_lb Last
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) #Geld auflisten_record_Listenelemente des Listenfeldgeldes auf_record_in lb einfügen
#Daten bekommen
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]
#Datenspeicher
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)
#Zeit h:mm:Konvertieren Sie in str-Typ in Form von 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()
Es fühlt sich ziemlich gut an.
Ich setze den Stundenlohn auf 300 Yen und verwende die Regel, dass ich die Arbeitszeit x 300 Yen als Hobby verwenden kann. Wenn Sie 5 Stunden arbeiten, können Sie 8 Stunden in ein Cartoon-Café gehen! Machen! !! !! Ich muss 20 Stunden lernen, um ein neues Spiel zu kaufen! !! Machen! !! !! Es hilft, die Motivation aufrechtzuerhalten.
Es ist nur eine kurze Zeit her, seit ich angefangen habe, Python zu berühren, und ich denke, es gibt eine Stelle im Code, die sagt "das ist besser". Ich würde es gerne für zukünftige Studien verwenden. Wenn Sie so etwas bemerken, würde ich es begrüßen, wenn Sie mich in den Kommentaren darüber informieren könnten.