Übungs-Programm zum Darstellen der Uhrzeit //Anfänger fragt

Fragen zu Tkinter.
Antworten
Benutzeravatar
JayOne
User
Beiträge: 22
Registriert: Mittwoch 12. Dezember 2012, 11:37

Hallo zusammen,

ich bin noch nicht allzu lange dabei und habe mich testweise mal an einem Miniprog versucht, welches kein Problem ist, bis auf die Tatsache dass es nicht funktioniert und ich nicht weiss wo das Problem ist:

Code: Alles auswählen

#!/usr/bin/env python3.2
# -*- coding: utf-8 -*-

import tkinter
import time

class little_time(tkinter.Frame):
    def __init__(self, master=None):
        tkinter.Frame.__init__(self, master)
        self.local_time = time.localtime()
        self.pack()
        self.create()

    def create(self):
        self.time_now = tkinter.StringVar()
        while True:
            zeit = self.akt_uhrzeit()
            self.time_now.set(zeit)
            time.sleep(1)
            
        self.time_now.set(bla)        
        self.lab = tkinter.Label(self)
        self.lab.pack()
        self.lab['textvariable'] = self.time_now

    def akt_uhrzeit(self):
        zeit = time.strftime('%H:%M:%S')
        self.akt_uhrzeit()

little_time()
Ich wollte die Ausgabe der Uhrzeit in Std/Min/Sec mit sekündlicher aktualisierung auf den Schirmbringen, dazu habe ich unten die Funktion akt_uhrzeit erstellt und sie dann weiter oben per while-Schleife zur permanenten aktualisierung der Steuerungsvariable eingebunden. Jedoch tut sich da rein gar nix.

Kann mir Jemand sagen woran das vielleicht liegt?
Faus 2, Akt 1: ...alles kann der Edle leisten, der versteht und rasch begreift...
lunar

@JayOne Die "while"-Schleife in ".create()" blockiert die Ereignisschleife von Tkinter. Nutze die von Tkinter zur Verfügung gestellte Methode ".after()", um die Anzeige der Zeit periodisch zu aktualisieren.
Benutzeravatar
JayOne
User
Beiträge: 22
Registriert: Mittwoch 12. Dezember 2012, 11:37

Danke dir ich werde gleich mal rüberschauen ob ich das hinbekomme :-)

add: also ich habe die after-Methode gefunden, aber wie soll ich die in Python3.2 verwenden?;
ich habe hier kein root-Objekt, also keines was ich als das identifizieren kann, wie soll ich dann .after() verwenden?
Faus 2, Akt 1: ...alles kann der Edle leisten, der versteht und rasch begreift...
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi JayOne willkommen im Forum

Wie lunar erwähnte ist die "while"-Schleife die eigendliche Bremse. Hier einige kleine Modifikationen:

Code: Alles auswählen

#!/usr/bin/env python3.2
# -*- coding: utf-8 -*-

import tkinter
import time

class little_time(tkinter.Frame):
    def __init__(self, master=None):
        tkinter.Frame.__init__(self, master)
        self.local_time = time.localtime()
        self.pack()
        self.create()

    def create(self):
        self.time_now = tkinter.StringVar()
#        while True:
#            zeit = self.akt_uhrzeit()
#            self.time_now.set(zeit)
#            time.sleep(1)
           
#        self.time_now.set(bla)       
        self.lab = tkinter.Label(self)
        self.lab.pack()
        self.lab['textvariable'] = self.time_now
        self.akt_uhrzeit()
        
    def akt_uhrzeit(self):
        zeit = time.strftime('%H:%M:%S')
#        self.akt_uhrzeit()
        self.time_now.set(zeit)
        self.after(500, self.akt_uhrzeit)

app_win = tkinter.Tk()

little_time(app_win)

app_win.mainloop()
Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
JayOne
User
Beiträge: 22
Registriert: Mittwoch 12. Dezember 2012, 11:37

Suuper, danke dir/euch, warum müssen einfache Probs immer so kompliziert sein?

MfG
J.
Faus 2, Akt 1: ...alles kann der Edle leisten, der versteht und rasch begreift...
Benutzeravatar
JayOne
User
Beiträge: 22
Registriert: Mittwoch 12. Dezember 2012, 11:37

Kannst du mir vllt. noch sagen was die Veränderung in den ltz. drei Codezeilen bewirkt? wenn ich die Klasse in anderen Programmen einfach mit irgendwasProg() aufrufe dann wird das auch ausgeführt.
Faus 2, Akt 1: ...alles kann der Edle leisten, der versteht und rasch begreift...
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

OK JayOne

Ohne die erste und die letzte Zeile der letzten drei Zeilen läuft deine Klasse nicht. Ich musste diese zwei Zeilen hinzufügen damit das wo du in der Klasse vorgibst sichbar wird.

Also die erste der letzten drei Zeilen:

Code: Alles auswählen

app_win = tkinter.Tk()
initialisiert Tkinter und erzeugt ein Hauptfenster auf dem Bildschirm.

Mit der zweiten Zeile:

Code: Alles auswählen

little_time(app_win)
wird deine Klasse little_time (Klassename geschrieben nach Python-Leitfaden PEP-8 besser LittleTime) initialisiert und das Object 'app_win' des Hauptfensters als 'master' übergeben.

Mit der letzten Zeile:

Code: Alles auswählen

app_win.mainloop()
wird benötigt damit Tkinter relevante Ereignisse abgefragt werden.

Wie gesagt ich habe diese Zeilen nur hinzugefügt um deine Klasse sichtbar auszutesten. Wenn dein übriges Programm Tkinter schon initialisiert hat und du nur deiner Klasse aufrufst braucht es dies Zeilen natürlich nicht.

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
JayOne
User
Beiträge: 22
Registriert: Mittwoch 12. Dezember 2012, 11:37

Danke dir mochmal, ich dachte eben dass diese Initialisierung durch den Code in __init__ geschieht.

Aber ich werden dann eben jedesmal das so schreiben, dauert eben noch ein bischen bis ich da ganz hintergestiegen bin. :-)
Faus 2, Akt 1: ...alles kann der Edle leisten, der versteht und rasch begreift...
Antworten