Python3石头剪刀布游戏报NameError: name 'outcome' is not defined如何解决?
错误原因
- 核心是执行顺序逻辑错误:
rock、paper、scissors三个函数中,先尝试调用outcome.config()修改控件文本,之后才调用output_window()创建outcome控件,执行修改操作时outcome还没有被定义,直接触发NameError。 - 额外不合理写法:滥用
global全局变量会导致多次运行游戏时变量残留冲突;每次新建结果窗口都创建Tk()实例不符合Tkinter规范,会导致窗口消息队列混乱,应该用Toplevel()创建子窗口。
修复方案
调整函数执行顺序,先计算对局结果再调用窗口创建函数,同时优化代码去掉不必要的全局变量,将结果直接作为参数传递给窗口创建函数。修复后可运行代码如下:
import random from tkinter import Tk, Button, Toplevel, Label def game(): ai_choice = {'0':'Rock', '1':'Paper', '2': 'Scissors'} # 窗口创建函数直接接收结果参数 def output_window(output): # 用Toplevel创建子窗口,不要重复创建Tk实例 show_output = Toplevel() show_output.title("Result") show_output.geometry("200x200") # 生成Label时直接赋值文本,不需要后续修改,也不需要全局变量存储控件 outcome = Label(show_output, text=output) outcome.pack() def rock(): ai = ai_choice[str(random.randint(0,2))] if ai == "Rock": output = "Tie" elif ai == "Scissors": output = "User Win" else: output = "User Lose" # 先计算结果,直接传给窗口创建函数 output_window(output) def paper(): ai = ai_choice[str(random.randint(0,2))] if ai == "Rock": output = "User Lose" elif ai == "Scissors": output = "Tie" else: output = "User Win" output_window(output) def scissors(): ai = ai_choice[str(random.randint(0,2))] if ai == "Paper": output = "Tie" elif ai == "Scissors": output = "User Lose" else: output = "User Win" output_window(output) # 主窗口绑定按钮逻辑 root = Tk() root.title("Rock Paper Scissors") Button(root, text="Rock", command=rock).pack(padx=20, pady=5) Button(root, text="Paper", command=paper).pack(padx=20, pady=5) Button(root, text="Scissors", command=scissors).pack(padx=20, pady=5) root.mainloop() if __name__ == "__main__": game()
内容的提问来源于stack exchange,提问作者Zven Reyes
相关产品推荐
相关产品推荐

