【问题标题】:tkinter list index out of rangetkinter 列表索引超出范围
【发布时间】:2021-10-31 19:38:11
【问题描述】:

当我运行此代码时,我在标题中收到这样的错误。我想制作 TODO 列表,但我在路上遇到了很多错误:(。我无法在其他函数中调用数组(tab),也无法更改复选框grid 中的列。

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 = []
tab.append("")
tab.append("")
r = 2
c = 1
cc = IntVar

def checking():
        tab[r].grid(row=r, column=1, padx=(10, 10), pady=(5, 5))

def addcheck():
    global r
    global c
    global cc

    if r < 16:
        tab.append(Checkbutton(variable = cc, text = task_name.get(), command = checking))
        tab[r].grid(row=r, column=0, padx=(10, 10), pady=(5, 5))
        r = r + 1
        task_entry.delete(0, 20)
    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()

完全错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\matib\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
    return self.func(*args)
  File "D:\pythonprojekty\pythonProject\main.py", line 18, in checking
    tab[r].grid(row=r, column=1, padx=(10, 10), pady=(5, 5))
IndexError: list index out of range

【问题讨论】:

  • 错误是什么(提供从单词“Traceback”开始的完整错误回溯),正如我已经提到的模式var = Widget(...).&lt;layout_manager&gt;(...) 是一个错误的模式
  • 添加到您的问题(您可以edit 它)而不是在 cmets 中,否则它们不会被格式化(并且在将该信息放入问题后删除评论)并且您不明白我在说什么模式,为什么还要在该列表中附加两个空字符串? r 也在发生变化,所以使用 tab[r] 无论如何都会给你该列表中的最后一项
  • 我添加了两个空字符串,因为我想从网格中的第三行开始
  • 我只想将选中的复选框中的列从 0 更改为 1
  • 只需使用Frames,那么您将能够从框架中的第 0 行开始,您的索引也是一个元素到高,例如,如果一个列表包含 2 个元素来访问第二个元素你需要使用[1]

标签: python python-3.x tkinter


【解决方案1】:

你得到IndexError是因为试图在checking()函数中使用全局变量r——修复它的方法是在调用它时显式传递row值作为参数.在下面的代码中,这是通过使用lambda 表达式来定义回调command= 函数来完成的。

您的代码中还有许多其他错误,我已尝试更正所有错误并重新格式化代码以遵循PEP 8 - Style Guide for Python Code 可读性建议。

import tkinter as tk
from tkinter import messagebox as msb
from tkinter.constants import *


win = tk.Tk()
win.title("Checkbutton")
win.geometry("300x600")
win.resizable(FALSE, FALSE)

task_name = tk.StringVar()
tab = [None, None]
r = len(tab)

def checking(row):
    tab[row].grid(row=row, column=1, padx=(10, 10), pady=(5, 5))


def addcheck():
    global r

    if r > 16:
        msb.showwarning(title="DANGER", message="TOO MANY TASKS, TAKE A REST")
    else:
        cb_var = tk.IntVar()
        tab.append(tk.Checkbutton(variable=cb_var, text=task_name.get(),
                                  command=lambda row=r: checking(row)))
        tab[r].grid(row=r, column=0, padx=(10, 10), pady=(5, 5))
        r += 1
        task_entry.delete(0, END)


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

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

task_entry.focus_set()
win.mainloop()

这是它在我的系统上运行的屏幕截图:

【讨论】:

    猜你喜欢
    • 2019-07-18
    • 1970-01-01
    • 2018-12-16
    • 2011-06-14
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多