Tkinter打字测试按钮无响应及计分异常问题求助
打字速度测试程序问题修复
问题分析与修复点
1. 点击「Start Test!」无反应/时间结束后报错
原代码中run_test函数结束时调用results_popup()未传入必要的correct_words参数,引发参数缺失错误导致流程中断。修复时需传入全局的correct_words变量。
2. correct_words仅能更新一次
check_word函数将correct_words作为参数传入,修改的是函数内部的局部变量,而非全局的correct_words。需移除该参数,并在函数内声明引用全局变量。
3. 结果弹窗显示正确单词数为0
由于全局correct_words未被正确更新,且弹窗调用时未传入参数,导致显示为0。修复后确保全局变量被修改,并正确传递参数到弹窗函数。
修复后的完整代码
import tkinter as tk import random wordbank = ['Lorem', 'ipsum', 'dolor', 'sit', 'amet,', 'consectetur', 'adipiscing', 'elit.', 'Nam', 'vitae', 'interdum', 'purus.', 'Mauris', 'pharetra', 'volutpat', 'augue,', 'id', 'elementum', 'enim', 'auctor', 'eget.', 'Praesent', 'diam', 'nulla,', 'condimentum', 'eget', 'cursus', 'sed,', 'imperdiet', 'vitae', 'arcu.', 'Quisque', 'lacus', 'enim,', 'finibus', 'eu', 'dolor', 'sit', 'amet,', 'pretium', 'pulvinar', 'libero.', 'In', 'maximus', 'elementum', 'varius.', 'Praesent', 'est', 'dui,', 'ultricies', 'vel', 'facilisis', 'non,', 'imperdiet', 'eget', 'eros.', 'Class', 'aptent', 'taciti', 'sociosqu', 'ad', 'litora', 'torquent', 'per', 'conubia', 'nostra,', 'per', 'inceptos', 'himenaeos.', 'Nunc', 'in', 'odio', 'nec', 'massa', 'faucibus', 'rhoncus', 'non', 'eu', 'libero.', 'Suspendisse', 'aliquam', 'iaculis', 'tellus,', 'ut', 'malesuada', 'purus', 'elementum', 'id.', 'Cras', 'ipsum', 'est,', 'sollicitudin', 'eu', 'ipsum', 'vehicula,', 'condimentum', 'volutpat', 'enim.', 'Fusce', 'massa', 'ipsum,', 'tempus', 'vel', 'dictum', 'sit', 'amet,', 'pretium', 'ut', 'nisl.', 'Pellentesque', 'vitae', 'convallis', 'neque,', 'eu', 'posuere', 'arcu.', 'Aenean', 'tempor', 'mi', 'risus,', 'aliquet', 'porta', 'metus', 'condimentum', 'ut.', 'Sed', 'sagittis', 'justo', 'magna,', 'sit', 'amet', 'suscipit', 'sem', 'pulvinar', 'hendrerit.', 'Integer', 'vitae', 'viverra', 'dui.', 'Vestibulum', 'ante', 'ipsum', 'primis', 'in', 'faucibus', 'orci', 'luctus', 'et', 'ultrices', 'posuere', 'cubilia', 'curae;', 'Aenean', 'pretium', 'augue', 'in', 'purus', 'tincidunt,', 'a', 'ornare', 'ligula', 'bibendum.', 'Aenean', 'condimentum', 'turpis', 'id', 'libero', 'pellentesque', 'rutrum.', 'Aliquam', 'scelerisque', 'vitae', 'massa', 'et', 'porttitor.', 'Etiam', 'erat', 'ex,', 'semper', 'at', 'faucibus', 'in,', 'semper', 'nec', 'turpis.', 'Donec', 'vel', 'tincidunt', 'justo,', 'sodales', 'posuere', 'nibh.', 'Duis', 'porttitor', 'risus', 'accumsan,', 'semper', 'nibh', 'nec,', 'malesuada', 'magna.', 'Integer', 'massa', 'arcu,', 'tincidunt', 'ut', 'interdum', 'ut,', 'auctor', 'quis', 'risus.', 'Nulla', 'facilisi.', 'Morbi', 'eleifend', 'massa', 'erat,', 'id', 'vestibulum', 'odio', 'sagittis', 'eu.', 'Sed', 'rhoncus,', 'ante', 'id', 'sollicitudin', 'imperdiet,', 'risus', 'lacus', 'mattis', 'lorem,', 'ut', 'fermentum', 'mi', 'dui', 'sit', 'amet', 'diam.', 'Fusce', 'vulputate', 'bibendum', 'lacinia.', 'Curabitur', 'iaculis', 'ex', 'sed', 'lectus', 'auctor,', 'quis', 'dapibus', 'odio', 'euismod.', 'Fusce', 'convallis', 'maximus', 'placerat.', 'Curabitur', 'non', 'ullamcorper', 'ligula,', 'elementum', 'consectetur', 'odio.', 'Phasellus', 'suscipit', 'lorem', 'pulvinar', 'porta', 'tincidunt.', 'In', 'vel', 'metus', 'neque.', 'Integer', 'tincidunt', 'laoreet', 'pharetra.', 'Integer', 'volutpat', 'elit', 'at', 'sollicitudin', 'laoreet.', 'Ut', 'aliquam', 'semper', 'tristique.', 'Phasellus', 'pretium', 'nisi', 'imperdiet', 'nunc', 'ornare', 'dictum.', 'Nunc', 'iaculis,', 'dolor', 'nec', 'faucibus', 'interdum,', 'nunc', 'tellus', 'maximus', 'leo,', 'nec', 'mollis', 'felis', 'lectus', 'in', 'quam.', 'Duis', 'enim', 'augue,', 'vestibulum', 'quis', 'sagittis', 'vitae,', 'fringilla', 'cursus', 'enim.', 'Phasellus', 'volutpat,', 'ante', 'in', 'rutrum', 'lacinia,', 'leo', 'urna', 'ornare', 'sem,', 'non', 'dictum', 'nisl', 'libero', 'vitae', 'libero.', 'Aliquam', 'ac', 'est', 'sed', 'arcu', 'interdum', 'elementum.', 'Nullam', 'tincidunt,', 'dolor', 'sed', 'pharetra', 'facilisis,', 'sapien', 'nunc', 'ultricies', 'justo,', 'sed', 'maximus', 'purus', 'turpis', 'in', 'ante.', 'Vestibulum', 'non', 'erat', 'molestie,', 'tincidunt', 'lectus', 'non,', 'tempor', 'enim.', 'Mauris', 'ligula', 'leo,', 'volutpat', 'in', 'vestibulum', 'et,', 'porttitor', 'sit', 'amet', 'diam.', 'Sed', 'vel', 'justo', 'dolor.', 'Duis', 'nec', 'felis', 'placerat,', 'sollicitudin', 'felis', 'id,', 'eleifend', 'purus.', 'Cras', 'non', 'porta', 'tellus.', 'Cras', 'et', 'sapien', 'feugiat,', 'aliquet', 'nibh', 'ac,', 'molestie', 'ex.', 'Aenean', 'vitae', 'scelerisque', 'lectus.', 'Proin', 'pulvinar', 'mollis', 'nulla,', 'nec', 'luctus', 'lacus', 'dapibus', 'quis.', 'Phasellus', 'scelerisque', 'eros', 'a', 'neque', 'pharetra', 'cursus.', 'Quisque', 'urna', 'est,', 'consequat', 'sed', 'ipsum', 'ut,', 'consequat', 'malesuada', 'odio.', 'Nunc', 'posuere', 'leo', 'nec', 'lacus', 'malesuada', 'efficitur.', 'Ut', 'fermentum', 'tincidunt', 'felis', 'vitae', 'sollicitudin.', 'Curabitur', 'sed', 'neque', 'bibendum,', 'fringilla', 'orci', 'nec,', 'consectetur', 'mauris.', 'Phasellus', 'ultrices', 'semper', 'mauris,', 'ultrices', 'mattis', 'lectus.', 'Nunc', 'sit', 'amet', 'auctor', 'neque.', 'Morbi', 'sed', 'neque', 'maximus,', 'egestas', 'sapien', 'et,', 'congue', 'augue.', 'Morbi', 'lacus', 'orci,', 'tincidunt', 'a', 'diam', 'sit', 'amet,', 'finibus', 'scelerisque', 'nisl.', 'Aenean', 'egestas', 'luctus', 'diam,', 'sit', 'amet', 'iaculis', 'urna', 'tempus', 'id.'] window = tk.Tk() window.title('Typing Speed Test!') correct_words = 0 seconds = 60 test_word = tk.StringVar(value=random.choice(wordbank)) scoreboard = tk.Label(window, text=f'Correct Words: {correct_words}') scoreboard.grid(row=0, column=0) timeclock = tk.Label(window, text=f'Seconds: {seconds}') timeclock.grid(row=1, column=0) def results_popup(correct_words): popup = tk.Toplevel(window) popup.geometry("300x100") popup.title("Results") # 调整标签位置,确保文字可见 tk.Label(popup, text=f"{correct_words} words per minute!", font=('Mistral 18 bold')).place(x=20,y=30) def run_test(remaining_seconds): if remaining_seconds > 0: timeclock.config(text=f'Seconds: {remaining_seconds}') window.after(1000, lambda: run_test(remaining_seconds - 1)) else: timeclock.config(text='Time\'s Up!') # 传入correct_words参数 results_popup(correct_words) def check_word(test_word): global correct_words # 声明引用全局变量 if TypeBox.get().strip() == test_word.get(): correct_words += 1 scoreboard.config(text=f'Correct Words: {correct_words}') TypeBox.delete(0, tk.END) # 清空输入框,提升体验 test_word.set(random.choice(wordbank)) WordDisplay = tk.Label(window, textvariable=test_word, font=('Arial 16')) WordDisplay.grid(row=2, column=0, padx=10, pady=10) TypeBox = tk.Entry(window, font=('Arial 16')) TypeBox.grid(row=3, column=0, padx=10, pady=10) StartButton = tk.Button(window, text='Start Test! >:)', command=lambda: run_test(seconds)) StartButton.grid(row=2, column=1, padx=10, pady=10) CheckAnswer = tk.Button(window, text='Check Answer!', command=lambda: check_word(test_word)) CheckAnswer.grid(row=3, column=1, padx=10, pady=10) window.mainloop()
额外优化点
- 添加
TypeBox.delete(0, tk.END),答对后自动清空输入框,提升使用体验 - 调整控件的
padx/pady和字体,让界面更美观 - 输入内容去除首尾空格,避免因误输入空格导致判断错误
内容的提问来源于stack exchange,提问作者astral monké
相关产品推荐
相关产品推荐

