Start kompletter Rewrite
begonnen mit UI Pin Pad erstellt
This commit is contained in:
parent
c617c886a1
commit
1ab664ef87
3
.idea/.gitignore
generated
vendored
Normal file
3
.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
8
.idea/Zeiterfassung.iml
generated
Normal file
8
.idea/Zeiterfassung.iml
generated
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="PYTHON_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="jdk" jdkName="Python 3.11" jdkType="Python SDK" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<settings>
|
||||||
|
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||||
|
<version value="1.0" />
|
||||||
|
</settings>
|
||||||
|
</component>
|
7
.idea/misc.xml
generated
Normal file
7
.idea/misc.xml
generated
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Black">
|
||||||
|
<option name="sdkName" value="Python 3.11" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11" project-jdk-type="Python SDK" />
|
||||||
|
</project>
|
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/Zeiterfassung.iml" filepath="$PROJECT_DIR$/.idea/Zeiterfassung.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
BIN
__pycache__/definitions.cpython-311.pyc
Normal file
BIN
__pycache__/definitions.cpython-311.pyc
Normal file
Binary file not shown.
5
definitions.py
Normal file
5
definitions.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# Zeiterfassung
|
||||||
|
# Quasi-Konsten
|
||||||
|
|
||||||
|
app_title = "Zeiterfassung"
|
||||||
|
app_version = "0.0.0"
|
75
ui.py
Normal file
75
ui.py
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
# Zeiterfassung
|
||||||
|
# UI Definitionen
|
||||||
|
|
||||||
|
import tkinter as tk
|
||||||
|
import locale
|
||||||
|
locale.setlocale(locale.LC_ALL, '')
|
||||||
|
|
||||||
|
from time import strftime
|
||||||
|
from definitions import app_title, app_version
|
||||||
|
|
||||||
|
# Pinpad
|
||||||
|
def win_pinpad():
|
||||||
|
|
||||||
|
def update_time():
|
||||||
|
string_time = strftime('%A, der %d.%m.%Y - %H:%M:%S')
|
||||||
|
nonlocal digital_clock
|
||||||
|
digital_clock.config(text=string_time)
|
||||||
|
digital_clock.after(1000, update_time)
|
||||||
|
|
||||||
|
root = tk.Tk()
|
||||||
|
root.title(app_title + " " + app_version)
|
||||||
|
# Digital clock label configuration
|
||||||
|
digital_clock = tk.Label(root)
|
||||||
|
digital_clock.grid(row=0, column=0, columnspan=3, padx=10, pady=10)
|
||||||
|
# Initial call to update_time function
|
||||||
|
update_time()
|
||||||
|
|
||||||
|
# Benutzernummer
|
||||||
|
tk.Label(root, text="Benutzernummer:").grid(row=1, column=0)
|
||||||
|
usernr = tk.Entry(root, width=10)
|
||||||
|
usernr.grid(row=1,column=1)
|
||||||
|
|
||||||
|
# Pinpad
|
||||||
|
|
||||||
|
def buttonPress(key):
|
||||||
|
|
||||||
|
nonlocal usernr
|
||||||
|
if type(key) is int:
|
||||||
|
if key < 10:
|
||||||
|
usernr.insert('end', str(key))
|
||||||
|
if key =="OK":
|
||||||
|
print("OK pressed")
|
||||||
|
if key == "<-":
|
||||||
|
usernr.delete(usernr.index("end") - 1 )
|
||||||
|
if len(usernr.get()) > 0:
|
||||||
|
buttons["OK"].configure(state="active")
|
||||||
|
else:
|
||||||
|
buttons["OK"].configure(state="disabled")
|
||||||
|
|
||||||
|
# Buttons definieren
|
||||||
|
button_width = 5
|
||||||
|
button_height = 2
|
||||||
|
pinframe = tk.Frame(root)
|
||||||
|
pinframe.grid(row=2, column=0, columnspan=3, padx=10, pady=10)
|
||||||
|
buttons = { }
|
||||||
|
|
||||||
|
keys = [
|
||||||
|
[ 1, 2, 3],
|
||||||
|
[ 4, 5, 6],
|
||||||
|
[ 7, 8, 9],
|
||||||
|
[ "<-", 0, "OK"]
|
||||||
|
]
|
||||||
|
|
||||||
|
for y, row in enumerate(keys, 1):
|
||||||
|
for x, key in enumerate(row):
|
||||||
|
button = tk.Button(pinframe, width=button_width, height=button_height, text=key, command=lambda key=key: buttonPress(key))
|
||||||
|
button.grid(row=y, column=x)
|
||||||
|
buttons[key] = button
|
||||||
|
|
||||||
|
buttons["OK"].configure(state="disabled")
|
||||||
|
|
||||||
|
# Tkinter main loop
|
||||||
|
|
||||||
|
root.mainloop()
|
||||||
|
|
113
zeiterfassung.py
113
zeiterfassung.py
@ -1,113 +0,0 @@
|
|||||||
#
|
|
||||||
#
|
|
||||||
# Zeiterfassung
|
|
||||||
|
|
||||||
# Bibliotheksimports
|
|
||||||
import time
|
|
||||||
import datetime
|
|
||||||
import os
|
|
||||||
|
|
||||||
# Statische Definitionen
|
|
||||||
# Pfade:
|
|
||||||
userfolder = "users"
|
|
||||||
settingsfolder = "settings"
|
|
||||||
program_name = "Zeiterfassung"
|
|
||||||
program_version = "0.0.0"
|
|
||||||
|
|
||||||
# Funktionen
|
|
||||||
|
|
||||||
# Zeitstempel schreiben
|
|
||||||
def append_timestamp(filename):
|
|
||||||
# Hole den aktuellen Timestamp in Epoch-Zeit
|
|
||||||
timestamp = int(time.time())
|
|
||||||
|
|
||||||
try:
|
|
||||||
# Öffne die Datei im Anhang-Modus ('a')
|
|
||||||
with open(filename, 'a') as file:
|
|
||||||
# Schreibe den Timestamp in die Datei und füge einen Zeilenumbruch hinzu
|
|
||||||
file.write(f"{timestamp}\n")
|
|
||||||
except FileNotFoundError:
|
|
||||||
# Fehlende Verzeichnisse anlegen
|
|
||||||
folder_path = os.path.dirname(filename)
|
|
||||||
os.makedirs(folder_path, exist_ok=True)
|
|
||||||
append_timestamp(filename)
|
|
||||||
|
|
||||||
# Anzahl der Zeilen zählen
|
|
||||||
def len_timestamps(filename):
|
|
||||||
try:
|
|
||||||
# Öffne die Datei im Lese-Modus ('r')
|
|
||||||
with open(filename, 'r') as file:
|
|
||||||
# Zähle die Zeilen
|
|
||||||
lines = file.readlines()
|
|
||||||
return len(lines)
|
|
||||||
except FileNotFoundError:
|
|
||||||
print(f"Die Datei {filename} wurde nicht gefunden.")
|
|
||||||
return 0
|
|
||||||
|
|
||||||
# Stempelzustand auslesen
|
|
||||||
def stempel_zustand(filename):
|
|
||||||
lines = len_timestamps(filename)
|
|
||||||
if lines == 0:
|
|
||||||
print(f"Keine Einträge")
|
|
||||||
elif lines % 2 == 0:
|
|
||||||
return("in")
|
|
||||||
else:
|
|
||||||
return("out")
|
|
||||||
|
|
||||||
# Stempelübersicht zusammenstellen
|
|
||||||
def overview(filename):
|
|
||||||
|
|
||||||
# Öffne die Datei im Lese-Modus ('r')
|
|
||||||
with open(filename, 'r') as file:
|
|
||||||
lines = file.readlines()
|
|
||||||
|
|
||||||
in_times = []
|
|
||||||
out_times = []
|
|
||||||
|
|
||||||
for i in range(0, len(lines)-1):
|
|
||||||
if (i + 1) % 2 == 0:
|
|
||||||
out_times.append(lines[i])
|
|
||||||
else:
|
|
||||||
in_times.append(lines[i])
|
|
||||||
for i in range(0, len(in_times) - 1):
|
|
||||||
print(str(in_times[i]) + " - " + str(out_times[i]))
|
|
||||||
|
|
||||||
# Pfade bestimmen
|
|
||||||
def scriptpath():
|
|
||||||
return os.path.dirname(os.path.abspath(__file__))
|
|
||||||
|
|
||||||
def determine_filename(user):
|
|
||||||
year = str(datetime.datetime.now().year)
|
|
||||||
month = str(datetime.datetime.now().month)
|
|
||||||
completepath = scriptpath() + "/" + userfolder +"/" + user + "/" + year + "-" + month + ".txt"
|
|
||||||
return completepath
|
|
||||||
|
|
||||||
# Benutzer anhand Verzeichnisse auflisten
|
|
||||||
def list_users(directory):
|
|
||||||
users = [d for d in os.listdir(directory) if os.path.isdir(os.path.join(directory, d))]
|
|
||||||
return users
|
|
||||||
|
|
||||||
|
|
||||||
# Hauptfunktion
|
|
||||||
def main():
|
|
||||||
print(program_name + " " + str(program_version))
|
|
||||||
print("Welche Funktion soll ausgeführt werden?")
|
|
||||||
print("1: Stempeln")
|
|
||||||
print("2: Stempelübersicht anzeigen")
|
|
||||||
question = int(input("Geben Sie Ihre Antwort ein: "))
|
|
||||||
|
|
||||||
if question == 1:
|
|
||||||
which_user = input("Für welchen User soll gestempelt werden? ")
|
|
||||||
append_timestamp(determine_filename(which_user))
|
|
||||||
print("Stempeleintrag vorgenommen")
|
|
||||||
elif question == 2:
|
|
||||||
which_user = input("Für welchen User sollen die Stempelzeiten angezeigt werden?" )
|
|
||||||
print("Zustand: " + stempel_zustand(determine_filename(which_user)))
|
|
||||||
overview(determine_filename(which_user))
|
|
||||||
else:
|
|
||||||
print("Keine Eingabe erkannt.")
|
|
||||||
|
|
||||||
|
|
||||||
# Programmstart
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
Loading…
x
Reference in New Issue
Block a user