Zeit bis Tastendruck messen

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
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Hallo

Ich wollte mittels `time()` die Zeit von Programmstart bis zum Betätigen der Leertaste messen, aber die Übergabe der Startzeit an die Zeitmessfunktion funktioniert nicht.

Der Code sieht so aus:

Code: Alles auswählen

import tkinter as tk
import time


def measure_key_press_time(event, start):
    if event:
        stop = time.time()
    print(stop-start)

def main():
    app_window = tk.Tk()
    app_window.bind("<Escape>", lambda e: app_window.quit())
    start = time.time()
    app_window.bind("<space>", measure_key_press_time, start)
    app_window.mainloop()

if __name__ == '__main__':
    main()
Gruß
Atalanttore
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Atalanttore: Schau Dir mal `functools.partial()` an. Dann musst Du allerdings die Reihenfolge der Argumente vertauschen die `measure_key_press_time()` erwartet. Oder verwende einen ``lambda``-Ausdruck.

`event` sollte übrigens immer ”wahr” sein, das ``if`` macht also keinen Sinn. Und sollte `event` dort nicht wahr sein, wird `stop` nicht definiert und Du bekämst deswegen gleich in der nächsten Zeile einen `NameError`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Funktioniert nicht, ist eine sehr schlechte Fehlerbeschreibung. Was passiert denn?

Was sind die Parameter, die man an »bind« übergeben kann?
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

Alternativ (ohne die Reihenfolge der Argumente zu vertauschen) geht auch

Code: Alles auswählen

partial(measure_key_press_time, start=time.time())
Ich würde auch eher `time.monotonic` oder `time.perf_counter` (oder die `*_ns`-Version aus Python 3.7) nehmen, damit es bei Uhrzeitänderungen keine Probleme gibt.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Sirius3 hat geschrieben: Mittwoch 11. Juli 2018, 08:51 Funktioniert nicht, ist eine sehr schlechte Fehlerbeschreibung. Was passiert denn?
Es passiert gar nichts, weil bereits der Start mit einer Fehlermeldung abgebrochen wird.

Einen `lambda`-Ausdruck verwende ich lieber nicht, aber mit `functools.partial()` funktioniert es:

Code: Alles auswählen

import tkinter as tk
import time
from functools import partial


def measure_key_press_time(event, start):
    stop = time.perf_counter()
    print(stop-start)

def main():
    app_window = tk.Tk()
    app_window.bind("<Escape>", lambda a: app_window.quit())
    start = time.monotonic()
    app_window.bind("<space>", partial(measure_key_press_time, start=time.monotonic()))
    app_window.mainloop()

if __name__ == '__main__':
    main()
Gruß
Atalanttore
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

@Atalanttore: `monotonic` und `perf_counter` zu mischen sieht für mich nach einem Fehler aus. Es wird nirgends garantiert, dass beide Funktionen die selbe Zeitquelle und den selben Referenzzeitpunkt verwenden.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Stimmt, da habe ich den Code nicht wieder vollständig von meinen Versuchen befreit.

Gruß
Atalanttore
Antworten