[Python] Ich habe versucht, mit tkinter eine Anwendung zu erstellen, die das Gehalt anhand der Arbeitszeit berechnet

Hintergrund

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."

Funktionen, die Sie hinzufügen möchten

--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)

Umgebung

Was ich eigentlich gemacht habe

Registerkarte Hauptbildschirm

2020-06-02.png Der Bildschirm beim Start sieht folgendermaßen aus.

2020-06-02 (1).png Wenn Sie die Taste "Start" drücken, startet der Timer und die Taste "Start" wechselt in die Taste "Pause".

2020-06-02 (2).png 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.

2020-06-02 (3).png Um versehentliche Klicks zu vermeiden, wird ein Bestätigungsfenster wie dieses angezeigt, wenn die Tasten "Fertig stellen" und "Zurücksetzen" gedrückt werden.

2020-06-02 (5).png 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").

Registerkarte Aufnahme

image.png 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.

image.png 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.

Registerkarte "Schubladenaufnahme"

image.png Sie können den Gehaltsabhebungsdatensatz sehen.

Registerkarte "Einstellungen"

image.png Sie können die Gesamtarbeitszeit überprüfen / zurücksetzen und den Stundenlohn ändern.

1591025774093.jpg 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.

Quellcode

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()

Versuchen Sie es mit dieser App

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.

Schließlich

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.

Recommended Posts

[Python] Ich habe versucht, mit tkinter eine Anwendung zu erstellen, die das Gehalt anhand der Arbeitszeit berechnet
Ich habe versucht, eine OCR-App mit PySimpleGUI zu erstellen
Ich habe eine einfache Mail-Sendeanwendung mit tkinter von Python erstellt
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe versucht, eine Originalsprache "PPAP Script" zu erstellen, die PPAP (Pen Pineapple Appo Pen) mit Python abbildet
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
[1 Stunde Herausforderung] Ich habe versucht, eine Wahrsagerseite zu erstellen, die für Python zu geeignet ist
Ich habe versucht, einen Generator zu erstellen, der mit Python eine C # -Containerklasse aus CSV generiert
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, eine Aktivität zu erstellen, die gemeinsam die Positionsinformationen festlegt
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Python] Einfaches Japanisch ⇒ Ich habe versucht, ein englisches Übersetzungswerkzeug zu erstellen
[1.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe mit TWE-Lite-2525A einen Öffnungs- / Schließsensor (Twitter-Link) erstellt
[AWS] [GCP] Ich habe versucht, die Verwendung von Cloud-Diensten mit Python zu vereinfachen
Ich habe versucht, mit Raspeye 4 (Python Edition) ein signalähnliches Signal zu erzeugen.
[Zaif] Ich habe versucht, den Handel mit virtuellen Währungen mit Python zu vereinfachen
Ich möchte ein Spiel mit Python machen
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, eine E-Mail mit SendGrid + Python zu senden
Ich habe versucht, einen periodischen Prozess mit CentOS7, Selenium, Python und Chrome durchzuführen
[Patentanalyse] Ich habe versucht, mit Python eine Patentkarte zu erstellen, ohne Geld auszugeben
[Python] Ich habe versucht, eine Shiritori-KI zu erstellen, die den Wortschatz durch Schlachten verbessert
Ich habe versucht, Kanas handschriftliche Zeichenerkennung Teil 3/3 Zusammenarbeit mit der GUI mithilfe von Tkinter durchzuführen
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Fortsetzung ・ Ich habe versucht, Slackbot zu erstellen, nachdem ich Python3 studiert habe
Ich habe versucht, mit Blenders Python script_Part 02 zu beginnen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, die alternative Klasse mit Tensorflow zu finden
Erstellen Sie mit tkinter eine Anwendung mit cx_freeze zu einer ausführbaren Datei
Ich habe versucht, AOJs Integer-Theorie mit Python zu lösen
Ich habe versucht, mit Python Machine Learning ein Echtzeit-Modell zur Trennung von Tonquellen zu erstellen
[Mac] Ich möchte einen einfachen HTTP-Server erstellen, auf dem CGI mit Python ausgeführt wird
Ich habe versucht, mit Python (Mac OS X) eine Umgebung für maschinelles Lernen zu erstellen.
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet