Brauche eine Art Stoppuhr/Timer als Tool

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
comeo
User
Beiträge: 5
Registriert: Freitag 2. August 2019, 13:18

Hallo zusammen, dies ist mein erster Post hier in dem Forum:)

Ich bin auf der Suche nach einer Python Funktion die als eine Art paralele Stoppuhr oder auch Timer arbeitet.

Hier ist mal ein Beispielcode von mir:

Code: Alles auswählen

import time
import random
    
 i = 0
    
    while i < 7:
    
        timeDelay = random.randrange(30, 60)
        
        time.sleep(5)
        
        print(timeDelay)
        
        time.sleep(timeDelay)
        
        i += 1
        
        if i==6:
            break
Hierbei schläft das Programm einfach die Zeit zwischen 30 und 60 Sekunden. Nun will ich anstatt einem timeDelay folgendes:
Es soll wieder eine random Zahl generiert werden zwischen 30 und 60 beispielsweise (Sekunden). Nun soll solange diese Zeit nicht abgelaufen ist, weiterer Programmcode ausgeführt werden können.
Hat jemand eine Idee, wie ich das lösen könnte?
Ich arbeite zum ersten Mal mit Python und wäre sehr dankbar für jede Hilfe!

LG
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sowas geht zB mit asyncio. Da kannst du in Tasks "await asyncio.sleep(x)" aufrufen, und dann schlaeft dieser Task. Andere werden aber noch ausgefuehrt.

Dein obiges Problem ist ja so ziemlich sinnlos. Worum genau geht es denn?
anonym13

Meine StopUhr:

from tkinter import *
import time

class StopWatch(Frame):
""" Implements a stop watch frame widget. """
def __init__(self, parent=None, **kw):
Frame.__init__(self, parent, kw)
self._start = 0.0
self._elapsedtime = 0.0
self._running = 0
self.timestr = StringVar()
self.makeWidgets()

def makeWidgets(self):
""" Make the time label. """
l = Label(self, textvariable=self.timestr)
self._setTime(self._elapsedtime)
l.pack(fill=X, expand=NO, pady=2, padx=2)

def _update(self):
""" Update the label with elapsed time. """
self._elapsedtime = time.time() - self._start
self._setTime(self._elapsedtime)
self._timer = self.after(50, self._update)

def _setTime(self, elap):
""" Set the time string to Minutes:Seconds:Hundreths """
minutes = int(elap/60)
seconds = int(elap - minutes*60.0)
hseconds = int((elap - minutes*60.0 - seconds)*100)
self.timestr.set('%02d:%02d:%02d' % (minutes, seconds, hseconds))

def Start(self):
""" Start the stopwatch, ignore if running. """
if not self._running:
self._start = time.time() - self._elapsedtime
self._update()
self._running = 1

def Stop(self):
""" Stop the stopwatch, ignore if stopped. """
if self._running:
self.after_cancel(self._timer)
self._elapsedtime = time.time() - self._start
self._setTime(self._elapsedtime)
self._running = 0

def Reset(self):
""" Reset the stopwatch. """
self._start = time.time()
self._elapsedtime = 0.0
self._setTime(self._elapsedtime)


def main():
root = Tk()
sw = StopWatch(root)
sw.pack(side=TOP)
root.title("Stopuhr")

Button(root, text='Start', command=sw.Start).pack(side=LEFT)
Button(root, text='Stop', command=sw.Stop).pack(side=LEFT)
Button(root, text='Reset', command=sw.Reset).pack(side=LEFT)
Button(root, text='Exit', command=exit).pack(side=LEFT)

root.mainloop()

if __name__ == '__main__':
main()




from tkinter import *
import time

class StopWatch(Frame):
""" Implements a stop watch frame widget. """
def __init__(self, parent=None, **kw):
Frame.__init__(self, parent, kw)
self._start = 0.0
self._elapsedtime = 0.0
self._running = 0
self.timestr = StringVar()
self.makeWidgets()

def makeWidgets(self):
""" Make the time label. """
l = Label(self, textvariable=self.timestr)
self._setTime(self._elapsedtime)
l.pack(fill=X, expand=NO, pady=2, padx=2)

def _update(self):
""" Update the label with elapsed time. """
self._elapsedtime = time.time() - self._start
self._setTime(self._elapsedtime)
self._timer = self.after(50, self._update)

def _setTime(self, elap):
""" Set the time string to Minutes:Seconds:Hundreths """
minutes = int(elap/60)
seconds = int(elap - minutes*60.0)
hseconds = int((elap - minutes*60.0 - seconds)*100)
self.timestr.set('%02d:%02d:%02d' % (minutes, seconds, hseconds))

def Start(self):
""" Start the stopwatch, ignore if running. """
if not self._running:
self._start = time.time() - self._elapsedtime
self._update()
self._running = 1

def Stop(self):
""" Stop the stopwatch, ignore if stopped. """
if self._running:
self.after_cancel(self._timer)
self._elapsedtime = time.time() - self._start
self._setTime(self._elapsedtime)
self._running = 0

def Reset(self):
""" Reset the stopwatch. """
self._start = time.time()
self._elapsedtime = 0.0
self._setTime(self._elapsedtime)


def main():
root = Tk()
sw = StopWatch(root)
sw.pack(side=TOP)
root.title("Stopuhr")

Button(root, text='Start', command=sw.Start).pack(side=LEFT)
Button(root, text='Stop', command=sw.Stop).pack(side=LEFT)
Button(root, text='Reset', command=sw.Reset).pack(side=LEFT)
Button(root, text='Exit', command=exit).pack(side=LEFT)

root.mainloop()

if __name__ == '__main__':
main()

Viel Spaß damit.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte code-tags benutzen, so ist die nicht nutzbar/lesbar/verstehbar.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@rexjohannes98: ein paar Anmerkungen zu Deinem Code.
Benutze keine *-Importe. Tkinter wird üblicherweise als `import tkinter as tk` eingebunden und alle Namen per tk.xy referenziert.
Namenskonvention ist unter Python für Module, Funktionen, Methoden und Variablennamen klein_mit_unterstrich.
`makeWidgets` sollte eigentlich direkt in __init__ stehen.
In `_setTime` solltest Du Ganzahl-Arithmetik // oder besser direkt divmod verwenden. `_setTime` ist dann auch eher `update_timestr` und da es immer mit self._elapsedtime aufgerufen wird, könnte man das Argument auch weglassen. Die Stringausgabe ist '%02d:%02d.%02d', sonst sieht es so aus, als ob man Stunden:Minuten:Sekunden hätte.
self._running ist ein Boolean, dafür gibt es True und False statt 1 und 0 in Python.
Statt `exit` (besser `sys.exit`) besser root.destroy verwenden.
anonym13

danke,
bin noch etwas neuer in der Python Welt.
comeo
User
Beiträge: 5
Registriert: Freitag 2. August 2019, 13:18

Danke an alle, ich schau es mir an:)
Antworten