Seite 1 von 1

Wecker Python + tkinter

Verfasst: Dienstag 19. Dezember 2017, 15:29
von eliram
Erstmal Hallo Zusammen, bin Informatiklehrling, und interessiere mich sehr für programmier und skriptsprachen, da ich diese in meiner Ausbildung fast gar nicht habe. Hab mir jetzt ein Raspberry PI geholt, und bin am Einstieg in Python.
Bin jetzt völlig verwirrt, da ich lange dran arbeite (seit 4 Stunden), und seit etwa einer halben Stunde weiss ich gar nicht mehr was ich da geschrieben habe, bin völlig durcheinander geraten.. :shock: :roll:
Als erstes möchte ich eigentlich nur etwas; nämlich mir die Zeit & Datum anzuzeigen in einem Fenster..

Ich zeige euch mal was ich habe:

Code: Alles auswählen

from datetime import *
from tkinter import *
from tkinter import messagebox

class UhrTag:
	def __init__(self):
		self.fenster = Tk()
		self.fenster.title("Wecker")

		self.anzeige = Label(self.fenster, height=5, width=100)
		minute = datetime.now().strftime('%M')
		z = datetime.now().strftime('%d-%m-%Y, %H:%M:%S')
                self.anzeige.pack()
                self.insert(END, "Current date & Time\n")
                T.insert(END, z)
while 1:
    fenster.update()
fenster.mainloop()

fenster.mainloop()
Was meint ihr? Bin ich auf dem richtigen Weg? und wie schaffe ich es, dass die Uhrzeit auch aktualisiert wird ? (Im Code ganz unten, diese while-Schleife).

Liebe Grüsse und vielen Dank im Voraus!
eliram

Re: Wecker Python + tkinter

Verfasst: Dienstag 19. Dezember 2017, 15:41
von __deets__
Dieses Thema wird hier wirklich fast täglich diskutiert. GUIs und while schleifen vertragen sich schlecht, weil GUIs immer auf Ereignisse reagieren können müssen.

Die Lösung liegt in timern, die man anmeldet & die dann einen callback zum gewünschten Zeitpunkt (mehr oder minder) aufrufen. In tkinter macht man das mit „after“

Schau mal hier in das tkinter Forum. Lies doch mal durch ein paar Themen, da finden sich sehr viele die das behandeln.

Re: Wecker Python + tkinter

Verfasst: Dienstag 19. Dezember 2017, 16:11
von Sirius3
@eliram: eingerückt wird immer mit 4 Leerzeichen pro Ebene, dann passieren auch nicht so Fehler wie in Zeile 13-15. Sternchenimporte vermeiden, weil man nicht kontrollieren kann, was da alles in den eigenen Namensraum geladen wird: `import tkinter as tk` und alle Namen mit tk. referenzieren. `minute` wird nirgends verwendet. `T` und `self.insert` existieren nicht. Statt `while 1:` heißt es `while True:`, die while-Schleife ist aber komplett überflüssig, da das selbe auch `mainloop` macht, das zweite mainloop ist auch überflüssig. `fenster` existiert nicht.

Bevor Du anfängst, viel Code zu schreiben, der nicht funktioniert, solltest Du Dein Programm Stück für Stück entwickeln. Also erst ein Fenster, dann eins mit einem Anzeigetext, dann den Anzeigetext auf die aktuelle Uhrzeit setzen und erst wenn diese Schritte alle funktionieren, anfangen, mit `after` die Uhrzeit periodisch zu aktualisieren.

Re: Wecker Python + tkinter

Verfasst: Dienstag 19. Dezember 2017, 19:16
von wuf
Hi eliram

Willkommen in unserem Forum. Hier noch etwas Code zum ausprobieren:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

from time import strftime
try:
    # Tkinter for Python 2.xx
    import Tkinter as tk
except ImportError:
    # Tkinter for Python 3.xx
    import tkinter as tk

APP_TITLE = "Current Date & Time"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 250
APP_HEIGHT = 200

LABEL_FONT = ('Helvetica', 20, 'bold')
LABEL_FG = 'steelblue4'


class UhrTag(tk.Frame):
    def __init__(self, parent):
        self.parent = parent
 
        tk.Frame.__init__(self, parent, bg='yellow')
        
        self.time_var = tk.StringVar()
        tk.Label(self, textvariable=self.time_var, font=LABEL_FONT,
            fg=LABEL_FG).pack()
        
        self.update_time()
    
    def update_time(self):
        self.time_var.set(strftime('%d.%m.%Y\n%H:%M:%S'))
        self.parent.after(1010, self.update_time)


def main():
    app_win = tk.Tk()
    app_win.title(APP_TITLE)
    app_win.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
    app_win.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
    
    UhrTag(app_win).pack(expand=True)
    
    app_win.mainloop()
 
 
if __name__ == '__main__':
    main()      
Gruss wuf :wink: