Wecker Python + tkinter

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
eliram
User
Beiträge: 1
Registriert: Dienstag 19. Dezember 2017, 15:24

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
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Antworten