wiedermal zeiterfassung

  • Hallo,
    ich versuche mich auch an einer zeiterfassung, als python script läuft es wunderbar, jetzt möchte ich mit tkinter gui programmieren, leider klappt das nicht so wie ich mich ausgedacht habe, ich lese DB aus erstelle eine liste mit usern entscprechendan statusen und wirde das dan gerne als Labels darstellen, und die Labels alle 2 sec aktualiesieren.
    das Programm muß mindestens 24 h laufen ohne das cpu oder Ram überfüllt werden.
    Kann mir da jemand vielleicht helfen?
    [code=php]
    #!/usr/bin/python
    # -*- coding: utf-8 -*-


    import Tkinter as tk
    import time
    import datetime
    import csv



    ts = time.time()
    sec = int(ts)
    dat = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d')
    zeit = datetime.datetime.fromtimestamp(ts).strftime('%H:%M:%S')
    zeit1 = datetime.datetime.fromtimestamp(ts).strftime('%H')
    time1 = ''



    class AppGUI:
        
    def get_status(self):
    stati = []
    with open('statuse.csv', 'rb') as csvfile:
    reader = csv.reader(csvfile, delimiter="'", quoting=csv.QUOTE_NONE)
    for row in reader:
    stati.append(row)
    return stati
    self.fenster.after(2000, self.get_status)


    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 __init__(self):
    r = 0
    self.fenster = tk.Tk()
    self.fenster.title('ZEITERFASSUNG')
    self.fenster.geometry("800x600")#+24+10
    self.fenster.configure(background='#AAC4D3')
            
    ### frame datzeit
    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
            
    #hier sollten die Labels hin
    #erstes, user
    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 = stati[7])
    # zweites aktuelles status
    self.lbs = tk.Label(self.statf, relief="sunken" , width=15, height=2, bg="red", font = "Verdana 10 bold")
    self.lbs.grid(row=r,column=1)
    #self.lbs.config(text="abwesend")#(text = stati[3])
    # drittes sonstiges
    self.lbk = tk.Label(self.statf, relief="sunken", width=15, height=2, bg="#AAC4D3", font = "Verdana 10 bold")
    self.lbk.grid(row=r,column=2)
    #self.lbk.config(text = stati[5])
    r += 1


    self.tick()
    self.fenster.after(2000, self.label_update)
    self.fenster.mainloop()
            
    def label_update(self):
            
    #hier labels zu,m aktualisieren????????


    self.fenster.after(2000, self.label_update)
         
    def main():
    app = AppGUI()
        
    if __name__ == '__main__':
    main()[/php]

    Edited once, last by dbv ().


  • Hallo,



    Heißt was genau? "Klappt nicht" kann alles und nichts bedeuten.


    Gruß, noisefloor



    ich weiß nicht wie ich die Labels erstellen soll und das die Labels alle 2 sec aktualiesiert werden.


    Gruß
    ganja

  • Also zunächst mal ein paar Tips zu deinem bisherigen Code:


    Gewöhn dir lieber jetzt schon an die Variablen entsprechend ihrem Sinn richtig zu benennen. Das macht es nicht nur jetzt sondern auch später (und auch für andere) wesentlich einfacher den Code zu verstehen.


    [code=php]
    ts = time.time()
    sec = int(ts)
    dat = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d')
    zeit = datetime.datetime.fromtimestamp(ts).strftime('%H:%M:%S')
    zeit1 = datetime.datetime.fromtimestamp(ts).strftime('%H')
    [/php]


    Der erste Gedanke der mir beim Anblick dieser Zeilen durch den Kopf schoss: What the Hell?
    Folgendes würde schon reichen:


    [code=php]
    dat = time.strftime('%Y-%m-%d')
    zeit = time.strftime('%H:%M:%S')
    zeit1 = time.strftime('%H')[/php]


    In der get_status Funktion führst du nach einem 'return' noch etwas aus, was aber nicht funktionieren wird. Ein 'return' stoppt augenblicklich, alles danach wird nicht mehr ausgeführt.


    Und wegen deiner Labels hast du doch schon alles vorhanden? :huh: Du musst in deine label_update halt die Labels noch mal "zeichnen" die du aktualisieren willst.



  • Danke, in get_status war am ende ein after(habe ich miterweile raus genommen), ich möchte das alles alle 2 sec aktualisiert wird, einlesen der liste ausgeben der Labels usw, das ganze fenster sollte eigentlich alle 2 sec atktualisiert werden.
    Genau da liegt mein problem das ich nicht weiß(ich weiß aber das ich im label update die labels updaten kann) wie ich aus get_status(return stati) die einzelnen statuse auslese, labels erstelle und dann in label_update aktualisiere die 3 schritte fehlen mir ich bekomme es nicht hin.

  • Hallo,


    ein funktionierendes Beispiel für sich automatisch aktualisierende Label gibt's bei SO: http://stackoverflow.com/quest…pdating-gui-using-tkinter.


    Und das `time` Modul ist ziemlich low-level. Wenn mögliche nimmt man das `datetime` Modul.



    Das aktuelle Datum bekommt man z.B. ganz einfach so:


    Code
    >>> import datetime
    >>> datetime.date.today()
    datetime.date(2015, 9, 21)
    >>>


    Man bekommt auch direkt ein datetime-Objekt anstatt wie bei `time.time()` eine Float-Wert.


    Gruß, noisefloor




  • Das clock() - tick() habe ich auch von da, es funktioniert auch,aber ich schafe es nicht meine labels mit den statusen aus der liste die ich aus DB auslese, zu aktualisieren.

  • Hallo,


    du rufst ja die Funktion `get_status()` nirgendwo auf...


    Guck' dir das Beispiel bei SO nochmal _genau_ an. Daraus kannst du auch direkt ableiten, wie das bei dir aussehen sollte.


    Im Beispiel bei SO wird mit `lab.config(text=time)` der Text des Labels neu gesetzt. Steht der Variablen `time` könnten hier auch ein Funktionsaufruf stehen, sofern die Funktionen einen String als Rückgabewert hat.


    Gruß, noisefloor

  • das steht drin



    (brauche ich nicht, 'user kürzel', 'status ändert sich immer wieder', 'sonstiges', 'user')
    status:
    k=kommen
    g=gehen
    p=pause
    m=mittag
    d=dienstgang


    (2L, 'xxx', 'k', '', 'xxxxxxx xxxx')
    (3L, 'xxx', 'k', '', 'xxxxx xxxxxxx')
    (4L, 'xxx', 'g', '', 'xxxxx xxxxxxxxx')
    (5L, 'xxx', 'g', '', 'xxxxxxx xxxx')
    (6L, 'xxx', 'g', '', 'xxxx xxxxx xxx')
    (7L, 'xxx', 'g', '', 'xxxxx xxxxx')
    (8L, 'xxx', 'g', '', 'xxxxx xxxxx')
    (9L, 'xxxl', 'p', '', 'xxxxx xxxx')
    (10L, 'xxx', 'g', 'k', 'xxxx xxx')
    (11L, 'xxx', 'g', '', 'xxxx xxxxxx')
    (12L, 'xxx, 'g', 'k', 'xxxxx xxxxxxxxx')
    (13L, 'xxx', 'k', '', 'xxxxx xxxxxxx')
    (14L, 'xxx', 'k', '', 'xxxx xxxxxx')
    (15L, 'xxx', 'k', '', 'xxxx xxxxx')

  • Hier mal ein minimales Beispiel.


    Gewöhne dir folgendes an:


    Trenne die GUI von der Logik
    Halte dich an die Namenskonvention (PEP8)
    Auf Modulebene haben sich nur Konstanten, Klassen und Funktionen zu befinden


    http://effbot.org/tkinterbook/…inter.Widget.after-method

  • Hallo,


    habe ich eben vergessen - und bootsmann war auch schneller:


    Da deine GUI in einer Klasse steckt, rufst du außer `__init___` keine der darin definieren Funktionen auf. So wie im Code von bootsmann ist es richtig.


    Tipp: Grundsätzlich sollte man das mit der Objektorientierung von Python, Instanzieren von Klassen, Methodenaufrufen usw. schon verstanden haben, wenn man sich an die GUI-Programmierung begibt. Sonst ist das nämlich schwer bis gar nicht für einen selber nachvollziehbar, was man da überhaupt treibt. Und dann ist es natürlich auch sehr schwer (bis unmöglich), Fehler im eigenen Code zu sehen und zu beheben.


    Gruß, noisefloor

  • Code

    Hier ist ein älteres beispiel von mir, leider friert die gui nach gewisser zeit ein, ich vermute die Labels werden nicht richtig aktualisiert.
    Vom assehen ist es ganau das was ich haben will, da es nicht richtig funktioniert dachte ich, ich versuche es mit mehreren files, mysql.py liest die DB aus und speichert den inhalt als tupel, da es für mich leichter ist es dann weiuter zu verarbeiten.
    Daher der neue obere versuch, Ich kenne mich in tkinter nicht aus, deshalb habe ich bei euch um hilfe gefragt, ich möchte nur das es läuft, und danach möchte ich es richtig machen mit allen ratschlägen die von euch kammen, aber im moment stehe ich auf dem schlauf, warschenlich habe ich noch nicht das OOP richtig verstanden.
    Kann man das hier zum laufen bekommen mit wenig aufwand?
    Hat jemand zeit und lust dazu mir hier zu helfen(meine kentnisse von 1-10, eher 2 was tkinter angeht)?
    Sollte ich hier weiter versuchen das es läuft oder doch liber mit mehreren files (rfid.py, mysql.py, Gui.py und rfid.txt, statuse.txt und vielleicht noch was) arbeiten, was ist der richtige weg?


    so erstelle ich statuse.txt in mysql.py
    with open('statuse.txt', 'w') as f:
    f.write("\n".join(map(lambda x: str(x), (row)))) #typel






    Gruß
    ganja

    Edited once, last by ganja ().