Entry, Eingabe der Uhrzeit mit Doppelpunkt

Fragen zu Tkinter.
Antworten
raibel
User
Beiträge: 30
Registriert: Mittwoch 15. November 2006, 22:03

Hallo,

wie kann ich ein tk.Entry-Feld formatieren, damit ich Uhrzeiten in u.g. Form eingeben und weiterverarbeiten kann?

z.B.: Entry-Eingabe(14:30) - Entry-Eingabe(12:30) = Listbox-Ausgabe(2:00)

Grüße

rai
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Soweit mir bekannt ist, kann man für Entry-Felder keine Eingabemaske vorgeben.
Unter der Voraussetzung, dass gültige Zeitangaben eingegeben wurden, könnte man es dann so machen:

Code: Alles auswählen

>>> def zeitdifferenz(z1,z2):
...     zeit1, zeit2 = z1.split(":"),z2.split(":")
...     dauer_min = (int(zeit2[0])-int(zeit1[0]))*60+int(zeit2[1])-int(zeit1[1])
...     return str(dauer_min//60)+":"+str(dauer_min%60).zfill(2)
...
>>> zeitdifferenz("18:10","19:09")
'0:59'
Das Auslesen der Entry-Felder und das Befüllen der Listbox ist vermutlich nicht das Problem.

Sind es Zeitdifferenzen, die über Mitternacht hinausgehen, müsste man noch was einbauen. Und ein bisschen exception-handling fehlt noch ...
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

pütone hat geschrieben:Sind es Zeitdifferenzen, die über Mitternacht hinausgehen, müsste man noch was einbauen. Und ein bisschen exception-handling fehlt noch ...
datetime.timedelta() macht sowas. :)
raibel
User
Beiträge: 30
Registriert: Mittwoch 15. November 2006, 22:03

Hi Pütone,

ja, mit 'split' funktioniert es. :-)

Code: Alles auswählen

import Tkinter as tk

root = tk.Tk()
e = tk.Entry(root)
e.grid()
e.insert(tk.END, '')
l = tk.Listbox(root)
l.grid()

def test(event):
    z = e.get()
    z.split(":")
    l.insert(tk.END, z)

e.bind('<KeyPress-Tab>', test)

root.mainloop()
Mir war erstmal nur wichtig, die Daten in der Doppelpunktform aus dem Entry in die Listbox zu bekommen.
Ich muß jetzt mal schauen, wie ich das in meinem Programm umsetze.

Danke erstmal!

Grüße
rai
raibel
User
Beiträge: 30
Registriert: Mittwoch 15. November 2006, 22:03

Storno! Retour! Löschen!

Ich hab gerade gemerkt, das 'split' in meinem Beispielcode gar keine Funktion hat! :oops:

Ich arbeite dran!

Grüße

rai
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

@raibel

Überhaupt sieht dein Code etwas verworren aus.

Ein Vorschlag: Zwei Entry-Felder, eine Listbox und ein Button. In die Entry-Felder die Uhrzeiten und dann Button klicken.

Per command-option des Buttons eine Funktion aufrufen, die die Entry-Felder ausliest und die beiden Strings als Parameter in die Funktion zeitdifferenz() steckt.
Das, was die Funktion zurückliefert, wird in die Listbox gesetzt.

Code: Alles auswählen

def zeitdifferenz(z1,z2):
    zeit1, zeit2 = z1.split(":"),z2.split(":")
    dauer = (int(zeit2[0])-int(zeit1[0]))*60+int(zeit2[1])-int(zeit1[1])
    return str(dauer//60)+":"+str(dauer%60).zfill(2)
Und natürlich wäre es keine schlechte Sache, wenn du das ganze objektorientiert aufziehen würdest.
raibel
User
Beiträge: 30
Registriert: Mittwoch 15. November 2006, 22:03

hi pytone,

bin gerade fertig geworden! Dein Code ist jetzt komplett drin.


Code: Alles auswählen

import Tkinter as tk

root = tk.Tk()

fl = []
for i in range(1):
    for j in range(2):
        f = tk.Frame(root)
        f.grid(column=i, row=j)
        fl.append(f)
        
list = []
for i in range(2):
    for j in range(1):
        e = tk.Entry(fl[0], width=7)
        e.grid(column=i, row=j)
        e.insert(tk.END, '')
        list.append(e)

l = tk.Listbox(fl[1], width=14)
l.grid()

def test(event):
    l1 = list[0].get() 
    l2 = list[1].get() 
    l1, l2 = l1.split(":"), l2.split(":")
    dauer_min = (int(l2[0])-int(l1[0]))*60+int(l2[1])-int(l1[1])
    z = str(dauer_min//60)+":"+str(dauer_min%60).zfill(2) 

    l.insert(tk.END, z)

e.bind('<KeyPress-Tab>', test)

root.mainloop()
Das ist auch genau das, was mein Programm macht: Arbeitszeiten berechnen.
(Man könnte natürlich auch 'Excel' nehmen :lol:)

Allerdings für mehrere Mitarbeiter und pro Monat:

Code: Alles auswählen

import Tkinter as tk

class Stundenplaner(object):                           
    def __init__(self, master):
        date = tk.Frame(master) #  frame =I=
        date.grid(column=0, row=1)
        
        l1 = []
        for c in range(1, 2): 
            for r in range(3):
                f = tk.Frame(master) #  frame =II=,=III=,=IV=
                f.grid(column=c, row=r)
                l1.append(f) 

        for r in range(1, 32):
            tk.Label(date, text = r, width=4).grid(ipady='1') #  -----> frame =I=
            
        tk.Entry(l1[0], width=10, bg='white').grid(ipadx='3') # -----> frame =II=

        self.d = {}
        for r in range(2, 33):
            for c in range(1, 3):
                entry = tk.Entry(l1[1], width=5, bg='white') # -----> frame =III=
                entry.grid(column=c, row=r)
                entry.insert(tk.END, 0)
                self.d[c, r] = entry
                entry.bind('<KeyPress-Tab>', self.berechnen)
        
        self.listbox = tk.Listbox(l1[2], width=10, height=1, bd='3', relief='ridge') # ----->frame =IV=
        self.listbox.grid(sticky='E', ipadx=2)
        
    def berechnen(self, event):
        list1 = []
        list2 = []
        for i in range(2, 33):
            a = 2, i
            b = 1, i
            x = float(self.d.get(a).get())
            list2.append(x)
            y = float(self.d.get(b).get())
            list1.append(y)
        s1 = sum(list1)
        s2 = sum(list2)
        s1s2 = s2 - s1
        x = self.listbox.insert(tk.END, '%.2f'% s1s2) 
        self.listbox.delete(0, tk.END)
        self.listbox.insert(tk.END, '%.2f'% s1s2) 
        
root = tk.Tk()
for r in range(1):
    for c in range(5): 
        tkT = tk.Frame(root, width=10)
        tkT.grid(column=c, row=r)
        s = Stundenplaner(tkT)    
root.mainloop()
Ich schau mal, das ich deinen code ins hauptprogramm bekomme!

Grüße

rai
Antworten