Re: listen zugriff
Verfasst: Dienstag 22. September 2015, 13:16
@ganja: Eine CSV-Datei mit ' als Trennzeichen ist seltsam. Oder versuchst Du die Tupeldarstellungen jetzt mit dem `csv`-Modul zu lesen‽
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
import Tkinter as tk
import time
import datetime
import MySQLdb
ts = time.time()
sec = int(ts)
dat = time.strftime('%Y-%m-%d')
zeit = time.strftime('%H:%M:%S')
zeit1 = time.strftime('%H')
time1 = ''
class AppGUI:
def tick(self):
global zeit
self.time2 = time.strftime('%H:%M:%S')
if self.time2 != zeit:
zeit = self.time2
self.clock.config(text = self.time2)
self.clock.after(1000, self.tick)
def get_status(self):
status_liste = []
db=MySQLdb.connect("xxxxxxxxx","xxxx","xxx","xxxx")
cursor = db.cursor()
cursor.execute("SELECT idx, user, status, korrektur, name FROM users ORDER BY idx")
for row in cursor:
status_liste.append(row)
#print status_liste
return status_liste
cursor.close()
db.close()
def __init__(self):
r = 0
self.fenster = tk.Tk()
self.fenster.title('ZEITERFASSUNG')
self.fenster.geometry("800x600")#+24+10
self.fenster.configure(background='#AAC4D3')
### frame oben time dat
self.datzeit = tk.Frame(self.fenster, width = 655, height = 30, bg = "yellow", relief = "sunken", border = 2) ##AAC4D3
self.datzeit.pack(fill='x', pady = "1")#side = 'top'
#lbl datzeit
self.labdat = tk.Label(self.datzeit, relief = "groove", width = 10, bg = "white", font = "Verdana 10 bold", text = dat)
self.labdat.pack(side = "right")
self.clock = tk.Label(self.datzeit, relief = "groove", width = 10, bg = "white", font = "Verdana 10 bold")
self.clock.pack(side = "right")#side=LEFT
### frame mitte label and buttons
self.statf = tk.Frame(self.fenster, width = 655, height = 450, bg = "red", relief = "flat", border = 2)
self.statf.pack(fill='x', pady = "1")
##### test hier labels erstellen ######
self.status = self.get_status()
for status_lesen in self.status:
status_lesen = list(status_lesen)
self.name = status_lesen[4]
self.akt_status = status_lesen[2]
self.korr = status_lesen[3]
if self.korr == 'k':
self.korr = "ZEITKORREKTUR"
if self.akt_status == 'g':
self.lbn = tk.Label(self.statf, relief="raised", width=15, height=2, bg="#AAC4D3", font = "Verdana 10 bold")
self.lbn.grid(row=r,column=0)
self.lbn.config(text = str(self.name))
self.lbs = tk.Label(self.statf, relief="raised", width=15, height=2, bg="#AAC4D3", font = "Verdana 10 bold")
self.lbs.grid(row=r,column=1)
self.lbs.config(text = str(self.akt_status))
self.lbk = tk.Label(self.statf, relief="raised", width=15, height=2, bg="#AAC4D3", font = "Verdana 10 bold")
self.lbk.grid(row=r,column=2)
self.lbk.config(text = str(self.korr))
r += 1
#########################################
self.tick()
self.fenster.after(2000, self.label_update)
self.fenster.mainloop()
def label_update(self):
##### test hier labels updaten ????????? ######
self.status = self.get_status()
for status_lesen in self.status:
status_lesen = list(status_lesen)
self.name = status_lesen[4]
self.akt_status = status_lesen[2]
self.korr = status_lesen[3]
if self.korr == 'k':
self.korr = "ZEITKORREKTUR"
print self.name,self.akt_status,self.korr,"1111" #wird richtig ausgegeben
self.lbn.config(text = str(self.name))
self.lbs.config(text = str(self.akt_status))
self.lbk.config(text = str(self.akt_status))
##################################################
self.fenster.after(2000, self.get_status)
self.fenster.after(2000, self.label_update)
def main():
app = AppGUI()
if __name__ == '__main__':
main()
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
BACKGROUND_COLOR = '#AAC4D3'
FONT = 'Verdana 10 bold'
def get_status():
with closing(
MySQLdb.connect('xxxxxxxxx', 'xxxx', 'xxx', 'xxxx')
) as connection:
with closing(connection.cursor()) as cursor:
cursor.execute(
'SELECT idx, user, status, korrektur, name'
' FROM users'
' ORDER BY idx'
)
return list(cursor)
class AppGUI(object):
def __init__(self):
self.root = tk.Tk()
self.root.title('ZEITERFASSUNG')
self.root['background'] = BACKGROUND_COLOR
# frame oben time dat
frame = tk.Frame(
self.root, background='yellow', 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='red', 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
}
row_number = 0
for _, _, state, correction, name in get_status():
if correction == 'k':
correction = 'ZEITKORREKTUR'
if state == 'g':
for column_number, text in enumerate([name, state, correction]):
label = tk.Label(self.status_frame, text=text, **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()
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()
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function
from datetime import datetime as DateTime
from sqlalchemy import CHAR, Column, DATE, ForeignKey, INTEGER, TIME, VARCHAR
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import object_session, relationship
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column('idx', INTEGER, primary_key=True)
# user = Column(?) Wird in einer Abfrage erwähnt aber nirgends verwendet.
status = Column(CHAR(1), nullable=False, default='!')
correction = Column('korrektur', CHAR(1), nullable=False)
name = Column(VARCHAR(200), nullable=False)
rfid = Column('RFID', VARCHAR(100), unique=True)
# `timestamps` as backreference from `Timestamp`
# `worktimes` as backreference from `Worktime`
def _add_timestamp(self, now=None):
self.timestamps.append(Timestamp.now(self, now))
def _timestamp2worktime(self, worktime_status, new_status):
session = object_session(self)
#
# Frage warum kann es hier mehr als einen Eintrag geben? Darf das
# überhaupt sein?
#
timestamps = (
session.query(Timestamp)
.filter_by(date=now.date(), status=self.status)
.order_by(Timestamp.seconds)
.desc()
.all()
)
for timestamp in timestamps:
if timestamp.time != 0:
session.add(
Worktime(
user=self,
date=timestamp.date(),
start_time=timestamp.time,
end_time=now.time(),
status=worktime_status,
)
)
break
# Ich hoffe ich habe die Logik an der Stelle äquivalent
# umgesetzt.
for timestamp in timestamps:
session.delete(timestamp)
self.status = new_status
def start_work(self):
now = DateTime.now()
if self.status in ['g', ' ']:
self.status = 'k'
self._add_timestamp(now)
elif self.status in ['p', 'm', 'd']:
self._timestamp2worktime(self.status, 'k')
def start_break(self):
self.status = 'p'
self._add_timestamp()
def start_lunch_break(self):
self.status = 'm'
self._add_timestamp()
def start_business_errand(self):
self.status = 'd'
self._add_timestamp()
def stop_work(self):
self._timestamp2worktime('A', 'g')
@classmethod
def get_all(cls, session):
return session.query(cls).all()
@classmethod
def get_by_rfid(cls, session, rfid):
return session.query(cls).filter_by(rfid=rfid).one()
class Timestamp(Base):
__tablename__ = 'Zeitstempel'
id = Column(INTEGER, primary_key=True)
user_id = Column('idx', INTEGER, ForeignKey(User), nullable=False)
date = Column('Datum', DATE, nullable=False)
time = Column('Uhrzeit', TIME, nullable=False)
seconds = Column('Sekunden', INTEGER, nullable=False)
status = Column('Status', CHAR(1), nullable=False)
user = relationship(User, backref='timestamps')
@classmethod
def now(cls, user, now=None):
if now is None:
now = DateTime.now()
return cls(
user=user,
date=now.date(),
time=now.time().replace(second=0),
seconds=now.second,
status=user.status,
)
class Worktime(Base):
__tablename__ = 'Arbeitszeit'
id = Column(INTEGER, primary_key=True)
user_id = Column('idx', ForeignKey(User))
date = Column('Datum', DATE, nullable=False)
start_time = Column('z1', TIME, nullable=False)
end_time = Column('z2', TIME, nullable=False)
status = Column(CHAR(1), nullable=False)
user = relationship(User, backref='worktimes')
Code: Alles auswählen
# ...
row_number = 0
for _, user, state, correction, _, in get_status():
if correction == 'k':
correction = 'ZEITKORREKTUR'
if state == 'k':
state = 'anwesend'
if state == 'p':
state = 'pause'
if state == 'm':
state = 'mittag'
if state == 'd':
state = 'dienstgang'
if state == 'g':
state = ''
for column_number, text in enumerate([user, state, correction]):
label = tk.Label(self.status_frame, text=text, **options)
label.grid(row=row_number, column=column_number)
self.status_widgets.append(label)
row_number += 1
Code: Alles auswählen
for row_number, (_, user, state, correction, _) in enumerate(get_status()):
if correction == 'k':
correction = 'ZEITKORREKTUR'
state = {
'k': 'anwesend',
'p': 'pause',
'm': 'mittag',
'd': 'dienstgang',
'g': '',
}[state]
options['background'] = 'red' if state == 'anwesend' else 'green'
for column_number, text in enumerate([user, state, correction]):
label = tk.Label(self.status_frame, text=text, **options)
label.grid(row=row_number, column=column_number)
self.status_widgets.append(label)