Python Tkinter乱序单词游戏字母显示异常、答案校验错误修复
Tkinter乱序单词猜词游戏Bug修复
问题根源
代码共存在4处逻辑错误,直接触发你遇到的两个故障:
- 乱序词存储逻辑错误:循环生成乱序词时反复覆盖
words变量,没有将每个单词的乱序结果存入列表,循环结束后words仅保存了最后一个答案拆分出的单字符集合,因此标签只能显示单个字母 - 随机索引越界:
random.randint()的取值范围是闭区间,直接以列表长度作为上界会生成超出合法索引范围的数值,触发取值异常 - 输入框绑定错误:输入框组件的
textvariable属性错误绑定了存储所有答案的answer列表,无法正确读取用户输入的内容,导致答案校验永远判定为错误 - 乱序字符未拼接:打乱单词字符后直接存储列表对象,展示时会输出带格式的Python列表字符串,而非连续的乱序单词
修复后可运行代码
import tkinter from tkinter import * import random from tkinter import messagebox from random import shuffle answer = ["python", "youtube", "google", "samosa", "india", "tea", "coffee"] words = [] # 修正乱序词生成逻辑 for i in answer: char_list = list(i) shuffle(char_list) # 打乱后拼接为字符串再存入列表 words.append(''.join(char_list)) # 修正随机索引范围,避免越界 num = random.randint(0, len(answer)-1) def initial(): global words, answer, num lbl1.configure(text=words[num]) def ans_check(): global words, num, answer user_input = e1.get() if user_input == answer[num]: messagebox.showinfo("Success", "yup, this is right!") Reset() else: messagebox.showinfo("Error", "Make sure it's without capitals") e1.delete(0, END) def Reset(): global words, num, answer # 修正重置时的随机索引范围 num = random.randint(0, len(answer)-1) lbl1.configure(text=words[num]) e1.delete(0, END) root = Tk() root.geometry('300x300') lbl1 = Label(root, font='times 20') lbl1.pack(pady=30, ipady=10, ipadx=10) answer12 = StringVar() # 修正输入框绑定的变量 e1 = Entry(root, textvariable=answer12) e1.pack(ipady=5, ipadx=5) bt1 = Button(root, text='Check', width=20, command=ans_check) bt1.pack(pady=40) bt2 = Button(root, text='Reset', width=20, command=Reset) bt2.pack() initial() root.mainloop()
核心修复点
- 重新实现乱序词生成逻辑:为每个答案单词单独拆分字符、打乱、拼接为字符串后存入
words列表,保证words和answer列表索引一一对应 - 所有随机数生成的上界改为
len(answer)-1,完全匹配列表合法索引范围 - 输入框正确绑定提前定义的
StringVar对象,保证可以正常读取用户输入 - 打乱后的字符通过
''.join()拼接为普通字符串,展示时为连续的乱序字母
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

