【问题标题】:IndexError: list assignment index out of range (List assignment)IndexError:列表分配索引超出范围(列表分配)
【发布时间】:2020-02-03 20:59:16
【问题描述】:

我正在尝试使这个 p = [0,25,43.3013,50,43.3013,25,0,0,0,0,0] 仅分配给位置 1,2,3,4,5 并制作其他为零。我得到了这个错误:

Tkinter 回调异常

Traceback(最近一次调用最后一次):

调用中的文件“C:\Users\sel\Anaconda3\lib\tkinter__init__.py”,第 1705 行 返回 self.func(*args)

文件“”,第 28 行,在 open_window1 中

p[1]=25

IndexError: 列表赋值索引超出范围

如何解决这个问题?

import numpy as np
import xlsxwriter
import tkinter as tk
from tkinter import *

import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure


window=Tk()


def open_window1():
    y = 1/2
    b = 1/4

    result = []
    u = []
    v = []

    t = []
    #p = [0,25,43.3013,50,43.3013,25,0,0,0,0,0]

    p = []

    p[1]=25
    p[2]=43.3013
    p[3]=50
    p[4] = 43.3013
    p[5] = 25

    a = []
    pn = []
    pn.append(0)

    m = 0.4559/100000
    k = 18
    c = 0.2865
    u.append(0)
    v.append(0)
    a.append((p[0]-c*v[0]-k*u[0])/m)

    dt = 0.1
    Tn = 1 

    st = Tn/dt + 1

    step = int(st)

    x = 0.0
    for i in range(step):
        z = x
        t.append("%.2f"% z)
        x = x + dt


    a1 =(m/(b*dt*dt)+y*c/(b*dt))
    a2 = (m/(b*dt)+(y/b-1)*c)
    a3 = (((1/(2*b))-1)*m + dt*((y/(2*b))-1)*c)
    kn = k + a1


    for i in range(step):
        while(i<1 and i>5):
            p[i] = 0


    for i in range(step-1):
        pn.append(np.around(p[i+1]+ a1*u[i] + a2*v[i] + a3*a[i], decimals=4))
        u.append(np.around(pn[i+1]/kn, decimals=4))
        v.append(np.around(y*(u[i+1]-u[i])/(b*dt) + (1-y/b)*v[i] + dt* (1-y/(2*b))*a[i], decimals=4))
        a.append(np.around((u[i+1]-u[i])/(b*dt*dt) - v[i]/(b*dt)-(1/(2*b)-1)*a[i], decimals=4))

    top = tk.Toplevel()
    top.wm_geometry("1200x540")
    top.title('Result table')

    canvas = tk.Canvas(top,bg="white", width=1195, height=540)
    canvas.grid(row=0,column=180)

    for i in range(0,len(t)):

        b6 = tk.Label(canvas, text=t[i], font= "calibri 12", bg="white")
        canvas.create_window(3,40*(i+1), window=b6, anchor=tk.NW)

    for i in range(0,len(t)):

        b6 = tk.Label(canvas, text=p[i], font= "calibri 12", bg="white")
        canvas.create_window(100,40*(i+1), window=b6, anchor=tk.NW)            

    for i in range(0,len(t)):

        b6 = tk.Label(canvas, text=pn[i], font= "calibri 12", bg="white")
        canvas.create_window(200,40*(i+1), window=b6, anchor=tk.NW)         

    for i in range(0,len(t)):

        b6 = tk.Label(canvas, text=a[i], font= "calibri 12", bg="white")
        canvas.create_window(300,40*(i+1), window=b6, anchor=tk.NW)     


    for i in range(0,len(t)):

        b6 = tk.Label(canvas, text=v[i], font= "calibri 12", bg="white")
        canvas.create_window(400,40*(i+1), window=b6, anchor=tk.NW)   

    for i in range(0,len(t)):

        b6 = tk.Label(canvas, text=u[i], font= "calibri 12", bg="white")
        canvas.create_window(500,40*(i+1), window=b6, anchor=tk.NW)   


b1=Button(window, text="Cons. Avg.", width=12, command=open_window1)
b1.grid(row=6,column=0)

window.title("Fill in the blanks")
window.geometry("350x133")
window.mainloop()

【问题讨论】:

  • 仅仅因为您使用的是 Tkinter 并不意味着您的问题与 Tkinter 有任何关系。此外,在尝试使用 Tkinter 之前,您应该确保您了解这些类型的东西——以及更多信息;先学走路再跑。

标签: python python-3.x


【解决方案1】:
p = []

p[1]=25
p[2]=43.3013
p[3]=50
p[4] = 43.3013
p[5] = 25

这在 Python 中是不允许的;您不能分配给尚未存在的列表索引。 (另外,第一个索引是0,而不是1。)您将p 设为一个空列表,因此这些分配都不允许。

要将值附加到列表的末尾,无论它已包含多少元素,请使用.append() 方法。

但首先使用注释掉的版本会更好:p = [0,25,43.3013,50,43.3013,25,0,0,0,0,0]

【讨论】:

    猜你喜欢
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 2020-02-13
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多