Auffrischung GUI klappt nicht

Fragen zu Tkinter.
Antworten
peko
User
Beiträge: 19
Registriert: Montag 5. Juni 2017, 14:41

Hallo zusammen,

ich möchte ein Türschild auf einem kleinen HDMI Display programmieren.
Angezeigt werden sollen neben der aktuellen Uhrzeit und dem Datum auch verschiedene
dynamische Texte.
Hier geht es mir jetzt nur um das Auffrischen der Uhrzeit, was nicht klappen will.
Die dynamischen Texte kommen dann später dran, wenn das Grundgerüst funktioniert.
(Diese sollen dann auch im Sekundentakt abgefragt bzw. erneuert werden)
Eventuell kann man mir auf die richtige Fährte helfen, wie ich die Uhrzeit "ans Laufen" bekomme.

Code: Alles auswählen

import tkinter as tk
import time


def aktualisieren():    
  aktzeit = time.strftime("%H:%M:%S")
  aktdatum = time.strftime("%d.%m.%Y")
  #Sonnenauf- und untergang  
  tagarray=['0825','0740','0700','0630','0520','0500','0500','0600','0700','0720','0750','0830']
  nachtarray=['1650','1730','1900','2030','2120','2155','2140','2100','1935','1800','1620','1600']

  # arrayabfrage über aktuellen Monat
  hell = tagarray[int(time.strftime('%m'))-1]
  dunkel = nachtarray[int(time.strftime('%m'))-1]

  if hell < time.strftime("%H%M"):
    timebackg = 'white'; timeforeg = 'black'
    mainbackg = '#ffffe0'; mainforeg = '#8B6914'
    vanzeige='TAG' # zum Prüfen
  if dunkel < time.strftime("%H%M"):
    timebackg = 'black'; timeforeg = 'white'
    mainbackg = '#8b6914'; mainforeg = '#ffffe0'
    vanzeige='NACHT' # zum Prüfen

  tuer = tk.Tk()
  tuer.geometry("360x240+0+0") 

  # Obere Zeile
  l = tk.Label(tuer,text='',fg=timeforeg, bg=timebackg)
  l.place(x = 0, y = 0, width=10, height=25)
  l = tk.Label(tuer,text=aktzeit,fg=timeforeg, bg=timebackg)
  l.place(x = 10, y = 0, width=60, height=25)
  l = tk.Label(tuer,text=vanzeige,fg=timeforeg, bg=timebackg)
  l.place(x = 70, y = 0, width=200, height=25)
  l = tk.Label(tuer,text=aktdatum,fg=timeforeg, bg=timebackg)
  l.place(x = 270, y = 0, width=80, height=25)
  l = tk.Label(tuer,text='',fg=timeforeg, bg=timebackg)
  l.place(x = 350, y = 0, width=10, height=25)
  # Hauptfenster oben
  l = tk.Label(tuer,font=('Arial', 20),text='Vorname & Vorname',fg=mainforeg, bg=mainbackg) 
  l.place(x = 0, y = 25, width=360, height=60)
  # Hauptfenster unten
  l = tk.Label(tuer,font=('Arial', 40), text='Nachname',fg=mainforeg, bg=mainbackg) 
  l.place(x = 0, y = 85, width=360, height=95)
  # Infofenster 
  l = tk.Label(tuer,font=('Arial', 15), text='individueller Text\n in zwei Zeilen',bg=mainforeg, fg=mainbackg) 
  l.place(x = 0, y = 180, width=360, height=60)

  tuer.mainloop()

while True:
  aktualisieren()
  time.sleep(0.2)  

Gruß
peko
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und taeglich gruesst das Murmeltier...

Dieses Thema ist gefuehlt jedes zweite, das hier im Tkinter Forum diskutiert wird. Die notwendigen Begriffe sind "mainloop", "events", "timer", und speziell "after" fuer tkinter.

Aus der ersten Seite der Beitrage im Tkinter-Forum einige Beispiele, die du dir mal anschauen kannst:

viewtopic.php?f=18&t=42358
viewtopic.php?f=18&t=42163

Letztlich finden sich viele viele mehr, wenn du mal nach "after" im Unterforum suchst.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Du fragst zu 6 verschiedenen Zeiten die aktuelle Uhrzeit ab und verknüpfst die Daten miteinander. Das kann zu seltsamen Ungereimtheiten führen. Frag einmal die Uhrzeit ab und benutze diese Information an den einzelnen Stellen, am besten mit datetime, time ist schon ziemlich low-level. Wenn man den Monat wissen will, dann kann man den dann auch direkt abfragen und muß nicht über ein String-Darstellung gehen.

Man erstellt einmal ein Fenster mit allen Labels, und aktualisiert dann nur den Inhalt. Es darf auch nur eine Tk-Instanz pro Prozess geben, Du willst aber 5 mal in der Sekunde eine neue erstellen und hast dann auch noch 5 Fenster pro Sekunde, die alle übereinander gemalt werden. (Da hast Du Glück dass die while-Schleife nicht funktioniert).

Aktualisieren macht man mit `after`. Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 2.
peko
User
Beiträge: 19
Registriert: Montag 5. Juni 2017, 14:41

Danke Euch beiden erstmal,
ich werde mich um das after() und um die Uhrzeiten kümmern.
Antworten