get a value of an textbox in tkinter while app is running

Question:

Hello i try to write a desktop app with tkinter for typing speed test i search but i cant find my answer is the any way to check the value of user entry in Textbox while app is running ? i need to compare user entry with test text i try to put the function before main loop when i init class but its just check the entry one time and also i try to use window.after()

this is my full code and problem is running last function

def run_test():
    random_number = random.randint(1, 5)
    test = session.query(data).filter(database.Database.id == random_number).first()
    return test


class UserInterFace:

    def __init__(self):
        customtkinter.set_appearance_mode("dark")
        customtkinter.set_default_color_theme("green")
        self.window = CTk()
        self.window.title("Typing Speed Test Application")
        self.window.resizable(False, False)
        self.window.config(padx=50, pady=50)
        self.window.geometry("1000x700")
        self.test = run_test()
        self.wrong_entry = 0
        self.correct_entry = 0
        self.test_running = True
        self.start_count = 5
        self.start_test_btn = None
        self.timer = None
        self.start_test_time = None
        self.end_test_time = None
        self.user_input = []
        self.get_ready_label = CTkLabel(master=self.window,
                                        font=timer_font,
                                        text="Get ready Test will be start in :",
                                        text_color="#609EA2")
        self.count_down_label = CTkLabel(master=self.window,
                                         font=count_down_font,
                                         text=str(self.start_count),
                                         text_color="#820000")
        self.label_test = CTkLabel(master=self.window,
                                   font=my_font2,
                                   text="",
                                   wraplength=900,
                                   )

        self.best_score_record = CTkLabel(master=self.window,
                                          font=my_font1,
                                          text_color="#609EA2",
                                          text="")
        self.type_area = CTkTextbox(master=self.window,
                                    width=900,
                                    height=200)
        self.main()
        self.tset_user_text(self.test.text, self.user_input)
        self.window.mainloop()

    def start_test(self, test):
        self.start_test_time = time.time()
        self.get_ready_label.grid_forget()
        self.count_down_label.grid_forget()
        test_id = test.id
        test_text = test.text
        test_record = test.record
        self.label_test.configure(text=test_text)
        if test_record == 0:
            test_record = "No Record Yet"
        else:
            test_record = f"Best Record : {test_record}"
        self.best_score_record.configure(text=test_record)
        self.best_score_record.grid(row=0, column=0)
        self.label_test.grid(row=1, column=0, pady=(20, 0))
        self.type_area.grid(row=2, column=0, pady=(20, 0))
        self.type_area.focus_set()
        self.user_input = self.type_area.get("1.0", END)

    def main(self):
        self.start_test_btn = CTkButton(master=self.window,
                                        text="Start Test",
                                        command=lambda: self.start_time(),
                                        height=100,
                                        width=300,
                                        font=my_font1)
        self.start_test_btn.grid(row=0, column=0, padx=(300, 0), pady=(250, 0))

    def start_time(self):
        if self.start_count >= 0:
            self.start_test_btn.grid_forget()
            self.get_ready_label.grid(row=0, column=0, pady=(50, 100), padx=(200, 0))
            self.count_down_label.grid(row=1, column=0, padx=(200, 0))
            self.count_down_label.configure(text=self.start_count)
            self.start_count -= 1
            self.timer = self.window.after(1000, self.start_time)
        else:
            self.window.after_cancel(self.timer)
            self.start_test(self.test)

    def tset_user_text(self, test_text, user_text):
        print("test")
        test_text_list = list(test_text)
        user_text_list = list(user_text)
        if len(test_text_list) <= len(user_text_list):
            self.test_running = False
            self.end_test_time = time.time()
            for n in range(len(test_text_list)):
                if test_text_list[n] == user_text_list[n]:
                    self.correct_entry += 1
                else:
                    self.wrong_entry += 1
Asked By: Pourya

||

Answers:

Okay, so take this with a grain of salt because I can’t test this on CustomTkinter, but you should be able to bind an event to your textbox like so:

# call a method called 'on_type' whenever a key is released in the text area
self.type_area.bind('<KeyRelease>', self.on_type)

You can define a callback method to handle this event. Thanks to the binding above, the event parameter is passed to your callback automatically when the event is triggered

def on_type(self, event):
    print(event)  # do whatever you need to do

FYI: binding to '<KeyRelease>' avoids (some) issues with key repeat caused by held keys

Answered By: JRiggles
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.