Seite 1 von 1

Zeit bis Tastendruck messen

Verfasst: Mittwoch 11. Juli 2018, 00:35
von Atalanttore
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

Re: Zeit bis Tastendruck messen

Verfasst: Mittwoch 11. Juli 2018, 08:30
von __blackjack__
@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`.

Re: Zeit bis Tastendruck messen

Verfasst: Mittwoch 11. Juli 2018, 08:51
von Sirius3
Funktioniert nicht, ist eine sehr schlechte Fehlerbeschreibung. Was passiert denn?

Was sind die Parameter, die man an »bind« übergeben kann?

Re: Zeit bis Tastendruck messen

Verfasst: Mittwoch 11. Juli 2018, 11:18
von narpfel
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.

Re: Zeit bis Tastendruck messen

Verfasst: Donnerstag 12. Juli 2018, 17:22
von Atalanttore
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

Re: Zeit bis Tastendruck messen

Verfasst: Donnerstag 12. Juli 2018, 19:24
von narpfel
@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.

Re: Zeit bis Tastendruck messen

Verfasst: Freitag 13. Juli 2018, 01:20
von Atalanttore
Stimmt, da habe ich den Code nicht wieder vollständig von meinen Versuchen befreit.

Gruß
Atalanttore