Sekundentakt halten

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
Tim Buktu
User
Beiträge: 1
Registriert: Montag 24. November 2014, 12:31

Hallo, meine erste Frage hier :)

Ich habe vor ein Programm zu schreiben, das im Wesentlichen im mehr oder weniger exakten Sekundentakt durchläuft. Wenn der Nutzer damit über eine GUI (Tkinter) interagiert, indem er Buttons drückt, sollen einige Berechnungen passieren. Wenn für einen bestimmten Prozess zuviel Zeit verstreicht, dann sollen eine Funktion sound() aufgerufen werden, in der ein paar winsound.Beep erzeugt werden etc.

Wie schaffe ich es aber diesen Sekundentakt aufrecht zu erhalten? Es muss ja nicht auf die Mikrosekunde stimmen. Aber wenn ich erstmal drei Sekunden lang winsound.Beep einfüge, dann zerhagelt mir das doch alles...

Im Wesentlichen also folgendes mit zwei Funktionen funk1() und funk2() und der Abfrage x == y. Die sound()-Funktion zerhagelt mir den Sekundentakt.

Code: Alles auswählen

def sound(): winsound.Beep(440, 1000); winsound.Beep(880, 1000); winsound.Beep(440, 1000)

while True:
    funkt1()
    funkt2()
    if x == y: sound()
    print "whatever"
    time.sleep(1)
Kann man vielleicht über die Systemzeit arbeiten und alles daran aufhängen? Nach meinem Verständnis ist aber doch eine schlechte Idee den Abstand zweier floats miteinander zu vergleichen, z.B. x = time.time() und später: if time.time() == x + 1:

Bin sehr dankbar für Hilfestellung / Anregungen.
Zuletzt geändert von Anonymous am Montag 24. November 2014, 13:29, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Tim Buktu: Auch ohne das Piepen wirst Du mit der Schleife und GUI-Programmierung schon Probleme bekommen denn Deine Schleife müsste dafür ja dauerhaft laufen. In einem GUI-Programm läuft aber nicht Dein Code in einer Schleife, sondern die Hauptschleife des GUI-Toolkits. Sonst wird nichts angezeigt oder aktualisiert und die GUI kann auch nicht darauf reagieren wenn der Benutzer zum Beispiel auf eine Schaltfläche klickt.

Wenn in einer GUI etwas regelmässig passieren soll, dann registriert man dafür in der Regel Funktionen die von der GUI-Hauptschleife nach einer angegebenen Zeit aufgerufen werden. In Tkinter gibt es dafür die `after()`-Methode auf Widget-Objekten.

Ein dreisekündiges Piepen würde auch die GUI drei Sekunden lahmlegen. Wenn man das nicht möchte, müsste man es parallel zur GUI-Hauptschleife in einem eigenen Thread ausführen, oder etwas zum Abspielen verwenden was nichtblockierende Aufrufe verwendet.

Gleitkommazahlen sollte man nicht auf *gleichheit* prüfen. Man kann aber durchaus prüfen ob eine Zeitdifferenz grösser oder gleich als ein bestimmter Wert ist.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Piepen dürfte sehr irritieren. Aber Grundsätzlich begrüße ich es, wenn ein Programm beim denken noch Lebenszeichen ausgibt. Vermisse ich bei vielen Programmen...

Ich mache in so einem Fall oft sowas:

Code: Alles auswählen

next_update=time.time()+1
for foo in bar:
    #...mach irgendwas...
    if time.time()>next_update:
        print("Status ausgeben...")
        next_update=time.time()+1
EDIT: Tkinter after() funktioniert allerdings dann nicht richtig, wenn man mit dem eigenen Schleife das ganze lähmt...
Konkrete Beispiele, von mir: https://github.com/jedie/DragonPy/searc ... &type=Code

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten