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

运行Tkinter TODO清单代码报list index out of range错误如何解决

Tkinter TODO清单问题修复方案

问题根因

  • IndexError: list index out of range报错:checking函数直接使用全局的r变量访问tab数组,每次新增任务后r会自增,点击历史新增的复选框时,r的值已经超过tab数组的最大合法索引,导致越界。同时原有代码所有复选框共用了未实例化的IntVar类,状态会互相干扰。
  • 无法调用自定义数组tab:tab是全局可变对象,读取、新增元素不需要额外声明,该问题本质是索引使用错误,并非无法调用数组。
  • 无法修改Checkbutton的grid列属性:Tkinter控件的grid布局属性不能直接赋值修改,需要调用控件的grid_configure()方法更新配置。

修复后完整代码

from tkinter import *
from tkinter import messagebox as msb
win = Tk()
win.title("Checkbutton")
win.geometry("300x600")
win.resizable(False,False)
task_name = StringVar()
tab = []
# 初始化两个占位元素,对应初始r=2的索引
tab.append("")
tab.append("")
r = 2

def checking(idx):
    btn = tab[idx]
    # 获取当前复选框的选中状态
    check_status = win.getvar(btn.cget('variable'))
    if check_status == 1:
        # 选中时移到DONE列
        btn.grid_configure(row=idx, column=1, padx=(10, 10), pady=(5, 5))
    else:
        # 取消选中时移回TO DO列
        btn.grid_configure(row=idx, column=0, padx=(10, 10), pady=(5, 5))

def addcheck():
    global r
    if r < 16:
        # 每个复选框绑定独立的IntVar实例,通过lambda传入当前索引
        new_cb = Checkbutton(win, variable=IntVar(), text=task_name.get(), command=lambda current_idx=r: checking(current_idx))
        tab.append(new_cb)
        tab[r].grid(row=r, column=0, padx=(10, 10), pady=(5, 5))
        r += 1
        task_entry.delete(0, END)
    else:
        msb.showwarning(title="DANGER", message="TOO MUCH TASKS, TAKE A REST")

text1 = Label(win, text = "TO DO:").grid(row = 1, column = 0, padx = (10, 10), pady = (30, 10))
text2 = Label(win, text = "DONE: ").grid(row = 1, column = 1, padx = (10, 10), pady = (30, 10))

task_entry = Entry(width = "20", textvariable = task_name)
task_entry.grid(row = 0, column = 0, padx = (30, 10))
add = Button(win, text = "add task", command = addcheck).grid(row = 0, column = 1, padx = (10, 10))

mainloop()

核心修改说明

  • 新增任务时通过lambda给每个Checkbutton绑定当前的索引值,点击复选框时将索引传入checking函数,不再使用全局r访问数组,彻底解决越界问题。
  • 每个Checkbutton单独绑定实例化的IntVar对象,所有复选框状态独立,不会互相干扰。
  • 调用grid_configure()方法更新控件的布局属性,实现选中后切换列的需求。
  • 修正了resizable参数类型、Entry清空范围的小问题。

内容的提问来源于stack exchange,提问作者Marin8

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:15:03