Python学习初期Tkinter绑定传参问题:骰子游戏报TypeError错误
解决Tkinter绑定函数时的Event对象索引错误问题
你遇到的这个错误很典型——Tkinter的绑定机制会自动把Event对象作为第一个参数传递给回调函数,而你的holdDie1函数把这个参数命名成了dice,导致你误以为它是全局的dice列表,尝试索引Event对象自然就报错了。
错误原因拆解
当你执行die1.bind("<Button-1>", holdDie1)时,每次点击Label,Tkinter都会把一个包含点击事件信息(比如点击位置、触发控件等)的Event对象传给holdDie1。而你的函数定义是def holdDie1(dice):,这里的dice其实是Event对象,不是你全局定义的那个列表,所以dice[0]就会抛出TypeError: 'Event' object does not support indexing。
修复方案
我们只需要调整函数参数,让它接收Event对象(哪怕你用不到这个参数),然后直接使用全局的dice和keep变量即可。另外还要修正global关键字的用法——它应该放在函数内部,用来声明要使用/修改全局变量,而不是在全局作用域中使用。
修正后的完整代码
from tkinter import * import random # 全局变量定义,不需要加global dice = [1,2,3,4,5] keep = [-1,-1,-1,-1,-1] def holdDie1(event): # 声明要修改全局的keep变量 global keep x = die1.cget("bg") if x == "white": die1.configure(bg="coral") keep[0] = dice[0] else: die1.configure(bg="white") keep[0] = -1 window = Tk() window.title("Dice") window.configure(background="white") die1 = Label(window, bg="white", text=dice[0], width=6, borderwidth=1, font="none 12 bold", relief="solid") die1.grid(row=1, column=0, padx=6) die1.bind("<Button-1>", holdDie1) # 启动窗口主循环,原代码遗漏了这一步 window.mainloop()
关键修改点
- 把
holdDie1(dice)改成holdDie1(event),接收Tkinter自动传递的Event对象 - 在函数内部添加
global keep,告诉Python我们要修改全局的keep列表 - 修正了原代码中导入语句的格式问题(应该分两行写)
- 添加了
window.mainloop(),否则窗口会初始化后直接关闭(原代码遗漏了这一核心步骤)
这样修改后,点击Label时就能正确切换背景色,并把dice[0]的值存入keep[0]了。
内容的提问来源于stack exchange,提问作者Rick Jeffries
相关产品推荐
相关产品推荐

