Skip to content Skip to sidebar Skip to footer

Python | How Do I Make A Fast Reaction Test With Tkinter?

I tried making a fast reaction tester with Tkinter Module in Python, but when I clicked the Start button, it justs freezes the window. And I don't know how to recover that Here's m

Solution 1:

Your error is that you are asking your program to enter an infinite loop when clicking the start button. The interpreter never leaves that loop, and thus the UI gets stuck without being able to update itself or receive input, because the interpreter is still stuck within your loop.

So you need to have another approach for this. Issues like these are normally handled by opening separate threads in your program, that can execute independently such that your main thread responsible for updating the UI window is not impacted by the child thread running your infinite loop. Then the main thread can at some point send a message to the child thread that the loop should be cancelled, when you user presses the stop button.

Handling this in tkinter has been made easy with the after() method, which simply put creates such an infinite loop in a separate thread to allow the main thread to keep running. I have below included a small example of how such an after loop can look, and you can try implementing that in your own code. If you still have problems, open a new question with more clarity.

import tkinter as tk
import time


classTimer:
    def__init__(self):
        self.root = tk.Tk()
        self.sv = tk.StringVar()
        self.start_time = None
        self.after_loop = None

        self.make_widgets()
        self.root.mainloop()

    defmake_widgets(self):
        tk.Label(self.root, textvariable=self.sv).pack()
        tk.Button(self.root, text='start', command=self.start).pack()
        tk.Button(self.root, text='stop', command=self.stop).pack()

    defstart(self):
        self.start_time = time.time()
        self.timer()

    deftimer(self):
        self.sv.set(round(time.time() - self.start_time))
        self.after_loop = self.root.after(500, self.timer)

    defstop(self):
        if self.after_loop isnotNone:
            self.root.after_cancel(self.after_loop)
            self.after_loop = None


Timer()

Post a Comment for "Python | How Do I Make A Fast Reaction Test With Tkinter?"