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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:58:13