You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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é

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 06:25:55