mitlerweile habe ich es fertig, es sieht so aus wie ich mir das vorgestellt habe und es funktioniert so wie ich es mir vorgestellt habe.
Ein paar kleinigkeiten gibt es auch die nicht so schön sind, das flakern beim löschen und neu erstellen der labels und buttons, finde ich nicht so schön, vielleicht hat da jemand ein rat für mich wie ich das besser lösen kann.
Ist es möglich das flackern beim löschen und neu schreiben der Labels weg zu bekommen, das es nicht flackert?
Kann man nur den inhalt der Labels aktualisieren ohne das alle Labels und Buttons neu erstellt werden?
Ist es vielleicht besser den update der Labels und buttons an die buttons zu übergeben, d.h. wenn ein button geklickt wird soll erst dann das update erfolgen?
Ist es möglich die ganzen buttons funktionen in eine große funktion zu packen?
hier noch mal code erweitert
Vielen Dank
Gruß
ganja
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function
import Tkinter as tk
from contextlib import closing
from datetime import datetime as DateTime
import MySQLdb
import serial
## test
import time
##
#### test
ts = time.time()
sec = int(ts)
dat = time.strftime('%Y-%m-%d')
zeit = time.strftime('%H:%M:%S')
zeit1 = time.strftime('%H')
BACKGROUND_COLOR = '#AAC4D3'
FONT = 'Verdana 10 bold'
def get_status():
with closing(
MySQLdb.connect('xxxxxxx', 'xxxxx', 'xxxx', 'xxxxx')
) as connection:
with closing(connection.cursor()) as cursor:
cursor.execute(
'SELECT idx, user, status, korrektur, name'
' FROM users'
' ORDER BY idx'
)
return list(cursor)
### noch nicht
def read_rfid():
ser = serial.Serial("/dev/ttyAMA0")
ser.baudrate = 9600
daten = ser.read(12)
ser.close()
daten = daten.replace("\x02", "" )
daten = daten.replace("\x03", "" )
daten = daten.lstrip()
return daten
###### funktioniert noch nicht
#def set_kommen():
# rfidnr = (open("/home/kul/ze/test.txt").read())
# #print(rfidnr,"111111")
# with closing(
# MySQLdb.connect('192.168.4.139', 'kul', 'ikul', 'c1kul')
# ) as connection:
# with closing(connection.cursor()) as cursor:
# cursor.execute(
# 'SELECT idx, status'
# 'FROM users'
# 'WHERE RFID=%s' % (rfidnr)
# #"WHERE RFID = '" + (rfidnr) + "' " geht noch nicht!!!!
# )
# print(idx, status)
def set_kommen():
rfidnr = open("/home/pi/ze/test.txt").read()
db=MySQLdb.connect("xxxxxx","xxxxxxx","xxxx","xxxxxxx")
cursor = db.cursor()
stat = "SELECT idx, status FROM users WHERE RFID = '" + (rfidnr) + "'"
cursor.execute(stat)
row = cursor.fetchall()
for row0 in cursor:
idx_user = row0[0]
status = row0[1]
#print (idx_user, status)
if status in ['g', '']:
cursor.execute("UPDATE users SET status='k' WHERE idx = %s",(idx_user))
cursor.execute("INSERT INTO Zeitstempel (idx, Datum, Uhrzeit, Sekunden, Status) VALUES (%s, %s, %s, %s, %s)",(idx_user,dat,zeit,sec,'k'))
elif status in ['p', 'm', 'd']:
#print(idx_user,status,"222222222")
cursor.execute("UPDATE users SET status='k' WHERE idx = %s",(idx_user))
cursor.execute("SELECT status, Uhrzeit FROM Zeitstempel WHERE idx = %s AND Datum = %s AND Status = %s Order by Sekunden DESC",(idx_user,dat,status))
row5 = cursor.fetchall()
for row5 in cursor:
z1 = row5[1]
status_new = row5[0]
if z1 != 0:
cursor.execute("INSERT INTO Arbeitszeit (idx, Datum, z1, z2, status) VALUES (%s, %s, %s, %s, %s)",(idx_user,dat,z1,zeit,status_new))
cursor.execute("DELETE FROM Zeitstempel WHERE idx = %s AND status = %s AND Datum = %s",(idx_user,status_new,dat))
cursor.close()
db.close()
def set_pause():
rfidnr = open("/home/pi/ze/test.txt").read()
db=MySQLdb.connect("xxxxxxxx","xxxxxxxx","xxxxxx","xxxxx")
cursor = db.cursor()
status = "SELECT idx, status FROM users WHERE RFID = '" + (rfidnr) + "'"
cursor.execute(status)
row = cursor.fetchall()
for row0 in cursor:
idx_user = row0[0]
status = row0[1]
print (idx_user, status)
cursor.execute("""UPDATE users SET status = 'p' WHERE idx = %s""",(idx_user))
cursor.execute("""INSERT INTO Zeitstempel (idx, Datum, Uhrzeit, Sekunden, Status) VALUES (%s, %s, %s, %s, %s)""",(idx_user,dat,zeit,sec,'p'))
cursor.close()
db.close()
def set_mittag():
rfidnr = open("/home/pi/ze/test.txt").read()
db=MySQLdb.connect("xxxxxxxx","xxxxxxx","xxxxxxx","xxxxxxx")
cursor = db.cursor()
status = "SELECT idx, status FROM users WHERE RFID = '" + (rfidnr) + "'"
cursor.execute(stat)
row = cursor.fetchall()
for row0 in cursor:
idx_user = row0[0]
status = row0[1]
#print (idx_user, status)
cursor.execute("UPDATE users SET status = 'm' WHERE idx = %s",(idx_user))
cursor.execute("INSERT INTO Zeitstempel (idx, Datum, Uhrzeit, Sekunden, Status) VALUES (%s, %s, %s, %s, %s)",(idx_user,dat,zeit,sec,'m'))
cursor.close()
db.close()
def set_dienstgang():
rfidnr = open("/home/pi/ze/test.txt").read()
db=MySQLdb.connect("xxxxxxx","xxxxx","xxx","xxxxx")
cursor = db.cursor()
status = "SELECT idx, status FROM users WHERE RFID = '" + (rfidnr) + "'"
cursor.execute(stat)
row = cursor.fetchall()
for row0 in cursor:
idx_user = row0[0]
status = row0[1]
#print (idx_user, status)
cursor.execute("UPDATE users SET status = 'd' WHERE idx = %s", (idx_user))
cursor.execute("INSERT INTO Zeitstempel (idx, Datum, Uhrzeit, Sekunden, Status) VALUES (%s, %s, %s, %s, %s)",(idx_user,dat,zeit,sec,'d'))
cursor.close()
db.close()
def set_gehen():
rfidnr = open("/home/pi/ze/test.txt").read()
db=MySQLdb.connect("xxxxxxxx","xxxxx","xxxxxx","xxxxx")
cursor = db.cursor()
stat = "SELECT idx, status FROM users WHERE RFID = '" + (rfidnr) + "'"
cursor.execute(stat)
row = cursor.fetchall()
for row0 in cursor:
idx_user = row0[0]
status = row0[1]
#print (idx_user, status)
cursor.execute("UPDATE users SET status = 'g' WHERE idx = %s",(idx_user))
cursor.execute("SELECT Status, Uhrzeit FROM Zeitstempel WHERE idx = %s AND Datum = %s AND Status = %s ORDER BY Sekunden DESC",(idx_user,dat,status))
row8 = cursor.fetchall()
for row8 in cursor:
status_new = row8[0]
z1new = row8[1]
if (row8 != 0):
cursor.execute("INSERT INTO Arbeitszeit (idx, Datum, z1, z2, status) VALUES (%s, %s, %s, %s, %s)",(idx_user,dat,z1new,zeit,'A'))
cursor.execute("DELETE FROM Zeitstempel WHERE status = %s AND Datum = %s AND idx = %s",(status_new,dat,idx_user))
cursor.close()
db.close()
class AppGUI(object):
def __init__(self):
self.root = tk.Tk()
self.root.title('ZEITERFASSUNG')
self.root['background'] = BACKGROUND_COLOR
self.root.geometry("800x650")#+24+10
# frame oben time dat
frame = tk.Frame(
self.root, background='#AAC4D3', relief=tk.SUNKEN, border=2
)
frame.pack(fill=tk.X, pady=1)
options = {'relief': tk.GROOVE, 'background': 'white', 'font': FONT}
self.date_label = tk.Label(frame, **options)
self.date_label.pack(side=tk.RIGHT)
self.clock_label = tk.Label(frame, **options)
self.clock_label.pack(side=tk.RIGHT)
# frame mitte label and buttons
self.status_frame = tk.Frame(
self.root, background='#AAC4D3', relief=tk.FLAT, border=2
)
self.status_frame.pack(fill=tk.X, pady=1)
self.status_widgets = list()
self.update_status()
self.update_clock()
self.root.mainloop()
def update_clock(self):
now = DateTime.now()
self.date_label['text'] = format(now, '%Y-%m-%d')
self.clock_label['text'] = format(now, '%H:%M:%S')
self.root.after(500, self.update_clock)
def update_status(self):
for widget in self.status_widgets:
widget.destroy()
self.status_widgets = list()
options = {
'relief': tk.RAISED, 'background': BACKGROUND_COLOR, 'font': FONT, 'width': 15, 'height': 2
}
row_number = 0
for _, _, state, correction, name, in get_status():
if correction == 'k':
correction = 'ZEITKORREKTUR'
if state == 'g':
state = 'abwesend'
for column_number, text in enumerate([name, state, correction]):#, urlaub, resturlaub]):
label = tk.Label(self.status_frame, text=text, **options)
label.grid(row=row_number, column=column_number)
self.status_widgets.append(label)
button = tk.Button(self.status_frame, relief="raised", width=5, height=1, bg='green', font = "Verdana 10 bold",text='kommen', command=set_kommen)
button.grid(row=row_number, column=5)
self.status_widgets.append(button)
row_number += 1
elif state == 'p':
state = 'pause'
for column_number, text in enumerate([name, state, correction]):#, urlaub, resturlaub]):
label = tk.Label(self.status_frame, text=text, relief="raised", width=15, height=2, bg="yellow", font = "Verdana 10 bold")#**options)
label.grid(row=row_number, column=column_number)
self.status_widgets.append(label)
button = tk.Button(self.status_frame, relief="raised", width=5, height=1, bg='green', font = "Verdana 10 bold",text='kommen', command=set_kommen)
button.grid(row=row_number, column=5)
self.status_widgets.append(button)
row_number += 1
elif state == 'm':
state = 'mittag'
for column_number, text in enumerate([name, state, correction]):#, urlaub, resturlaub]):
label = tk.Label(self.status_frame, text=text, relief="raised", width=15, height=2, bg="yellow", font = "Verdana 10 bold")#**options)
label.grid(row=row_number, column=column_number)
self.status_widgets.append(label)
button = tk.Button(self.status_frame, relief="raised", width=5, height=1, bg='green', font = "Verdana 10 bold",text='kommen',command=set_kommen)
button.grid(row=row_number, column=5)
self.status_widgets.append(button)
row_number += 1
elif state == 'd':
state = 'dienstgang'
for column_number, text in enumerate([name, state, correction]):#, urlaub, resturlaub]):
label = tk.Label(self.status_frame, text=text, relief="raised", width=15, height=2, bg="blue", font = "Verdana 10 bold")#**options)
label.grid(row=row_number, column=column_number)
self.status_widgets.append(label)
button = tk.Button(self.status_frame, relief="raised", width=5, height=1, bg='green', font = "Verdana 10 bold",text='kommen',command=set_kommen)
button.grid(row=row_number, column=5)
self.status_widgets.append(button)
row_number += 1
elif state == 'k':
state = 'anwesend'
for column_number, text in enumerate([name, state, correction]):#, urlaub, resturlaub]):
label = tk.Label(self.status_frame, text=text, relief="raised", width=15, height=2, bg="green", font = "Verdana 10 bold")#**options)
label.grid(row=row_number, column=column_number)
self.status_widgets.append(label)
button_pause = tk.Button(self.status_frame, relief="raised", width=4, height=1, bg='yellow', font = "Verdana 10 bold",text='pause',command=set_pause)
button_pause.grid(row=row_number, column=6)
button_mittag = tk.Button(self.status_frame, relief="raised", width=4, height=1, bg='yellow', font = "Verdana 10 bold",text='mittag',command=set_mittag)
button_mittag.grid(row=row_number, column=7)
button_dienstgang = tk.Button(self.status_frame, relief="raised", width=7, height=1, bg='blue', font = "Verdana 10 bold",text='dienstgang', command=set_dienstgang)
button_dienstgang.grid(row=row_number, column=8)
button_gehen = tk.Button(self.status_frame, relief="raised", width=4, height=1, bg='red', font = "Verdana 10 bold",text='gehen',command=set_gehen)
button_gehen.grid(row=row_number, column=9)
self.status_widgets.append(button_pause)
self.status_widgets.append(button_mittag)
self.status_widgets.append(button_dienstgang)
self.status_widgets.append(button_gehen)
row_number += 1
elif state == '!':
state = 'unbekannt'
for column_number, text in enumerate([name, state, correction]):#, urlaub, resturlaub]):
label = tk.Label(self.status_frame, text=text, relief="raised", width=15, height=2, bg="dark-red", font = "Verdana 10 bold")#**options)
label.grid(row=row_number, column=column_number)
self.status_widgets.append(label)
row_number += 1
self.root.after(2000, self.update_status)
def main():
AppGUI()
if __name__ == '__main__':
main()