Zeit

Fragen zu Tkinter.
Antworten
Q-bert
User
Beiträge: 3
Registriert: Samstag 4. August 2018, 18:01

Hallo. Ich wollte eine Programm machen die bei einem Button click die Uhrzeit + 8 angibt. Habe ich auch gemacht. Jetzt möchte ich auch , dass wenn ich auf Stop drücke, die Zeit die vergangen ist gezählt wird und das was herauskommt auf die Uhrzeit + 8 drauf gerechnet wird, sobald ich wieder auf Start drücke .

Wie würde man sowas machen ?
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Q-bert: zeig doch mal, was Du bisher versucht hast.
Q-bert
User
Beiträge: 3
Registriert: Samstag 4. August 2018, 18:01

Ich weiß nicht wie man einen Code hier eingibt. Einfach als Text ?
Q-bert
User
Beiträge: 3
Registriert: Samstag 4. August 2018, 18:01

Also das alles gemacht. Beurteilt nicht so hart :). Ich bin Anfänger :).

Code: Alles auswählen

from datetime import timedelta
import datetime
import tkinter as tk


root = tk.Tk()
root.geometry("200x400")

def getTime():
	timeNow1 = datetime.datetime.now()
	timeString1 = timeNow1.strftime('%H:%M:%S')
	label1 = tk.Label(root, text=timeString1).grid(row=0, column=0, sticky='W')

	timeNow2 = datetime.datetime.now() + timedelta(hours=8)
	timeString2 = timeNow2.strftime('%H:%M:%S')
	label2 = tk.Label(root, text=timeString2).grid(row=4, column=1, sticky='W')

	return timeString2

def stopTime():
	timeNow3 = datetime.datetime.now()
	timeString3 = timeNow3.strftime('%H:%M:%S')
	label3 = tk.Label(root, text=timeString3).grid(row=1, column=0, sticky='W')
	return timeString3

def fortTime():
	timeNow4 = datetime.datetime.now()
	timeString4 = timeNow4.strftime('%H:%M:%S')
	label4 = tk.Label(root, text=timeString4).grid(row=2, column=0, sticky='W')
	return timeString4

def rechnen():
	timeNow5 = datetime.datetime.strptime(fortTime(), '%H:%M:%S') - datetime.datetime.strptime(stopTime(), '%H:%M:%S')
	timeNow6 = datetime.datetime.strptime(getTime(), '%H:%M:%S') + timeNow5
	timeString6 = timeNow6.strftime('%H:%M:%S')
	label6 = tk.Label(root, text=timeString6).grid(row=4, column=1, sticky='W')

button1 = tk.Button(root, text = "Start", command = getTime, height = 5, width = 10).grid(row=0, column=1, sticky='W')
button2 = tk.Button(root, text = "Stop", command = stopTime, height = 5, width = 10).grid(row=1, column=1, sticky='W')
button3 = tk.Button(root, text = "Fortsetzen", command = fortTime, height = 5, width = 10).grid(row=2, column=1, sticky='W')
button4 = tk.Button(root, text = "Rechnen", command = rechnen, height = 5, width = 10).grid(row=3, column=1, sticky='W')

root.mainloop()
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Du wirst nicht beurteilt, und bei Deinem Programm gibt es nur Raum für Verbesserungen, und zum Besser werden hast Du Dich ja hier im Forum angemeldet.

Variablen durchzunummerieren ist immer ein Zeichen dafür, dass man nicht genau weiß für was die Variable steht; Variablen haben nur innerhalb ihrer Funktion Gültigkeit. Daher kann man innerhalb verschiedener Funktionen gefahrlos den selben Variablennamen verwenden. Der Rückgabewert der grid-Methode von Label ist None, also nichts. Den an eine Variable zu binden, die zudem nicht weiter benutzt wird, ist unnötig.

Man sollte nicht ständig neue Labels erzeugen, die werden nämlich alle übereinandergezeichnet. Statt dessen baut man einmal das gesamte Fenster mit allen Labels auf, und ändert später nur noch ihren Text.

Funktionen, die auf Ereignisse (Knopfdruck) reagieren, sollten keinen Rückgabewert haben. Du benutzt die Funktionen aber auch noch auf eine andere Art, dazu später mehr.

In getTime wird zwei mal die aktuelle Zeit ermittelt. Sollen die Zeiten wirklich exakt 8 Stunden auseinanderliegen, sollte das nur einmal passieren. timeNow2 ist ein irreführender Name, wenn es sich gar nicht um die aktuelle Zeit handelt.

Funktionsnamen und Variablen werden klein_mit_unterstrich geschrieben, eingerückt wird immer mit 4 Leerzeichen pro Ebene. Auf oberster Ebene sollte gar kein ausführbarer Code stehen, nur Konstanten und Definitionen.

Baut man das Programm nach den obigen Anmerkungen um, merkt man, dass stopTime und fortTime identisch sind, man also nur eine Funktion mit dem Label als Parameter braucht.

Code: Alles auswählen

import datetime
import tkinter as tk
from functools import partial

def get_time(start_time, finish_time):
    now = datetime.datetime.now()
    start_time['text'] = now.strftime('%H:%M:%S')
    later = now + datetime.timedelta(hours=8)
    finish_time['text'] = later.strftime('%H:%M:%S')
    return finish_time['text']

def set_time(time_label):
    now = datetime.datetime.now()
    time_label['text'] = now.strftime('%H:%M:%S')
    return time_label['text']

def rechnen(start_time, finish_time, stop_time, fort_time):
    fort = set_time(fort_time)
    stop = set_time(stop_time)
    finish = get_time(start_time, finish_time)
    delta = datetime.datetime.strptime(fort, '%H:%M:%S') - datetime.datetime.strptime(stop, '%H:%M:%S')
    time = datetime.datetime.strptime(finish, '%H:%M:%S') + delta
    finish_time['text'] = time.strftime('%H:%M:%S')

def main():
    root = tk.Tk()
    root.geometry("200x400")
    start_time = tk.Label(root)
    start_time.grid(row=0, column=0, sticky='W')
    finish_time = tk.Label(root)
    finish_time.grid(row=4, column=1, sticky='W')
    stop_time = tk.Label(root)
    stop_time.grid(row=1, column=0, sticky='W')
    fort_time = tk.Label(root)
    fort_time.grid(row=2, column=0, sticky='W')

    tk.Button(root, text="Start", command=partial(get_time, start_time, finish_time),
        height=5, width=10).grid(row=0, column=1, sticky='W')
    tk.Button(root, text="Stop", command=partial(set_time, stop_time),
        height=5, width=10).grid(row=1, column=1, sticky='W')
    tk.Button(root, text="Fortsetzen", command=partial(set_time, fort_time),
        height=5, width=10).grid(row=2, column=1, sticky='W')
    tk.Button(root, text="Rechnen", command=partial(rechnen, start_time, finish_time, stop_time, fort_time),
        height=5, width=10).grid(row=3, column=1, sticky='W')
    root.mainloop()

if __name__ == '__main__':
    main()
Jetzt schau Dir die Funktion `rechnen` genau an. Dort werden drei Zeiten ermittelt, zwei mal die aktuelle Zeit und einmal die in 8 Stunden. Die Differenz der ersten beiden (0) wird auf die dritte addiert. Versuch mal genau zu erklären, was Du eigentlich machen willst, und versuche in einem zweiten Schritt, diese Erklärung in eine Funktion zu übersetzen.
Antworten