如何在 python 3.4 tkinter“索引错误:列表索引超出范围”中修复此错误

Posted

技术标签:

【中文标题】如何在 python 3.4 tkinter“索引错误:列表索引超出范围”中修复此错误【英文标题】:How can I fix this error in python 3.4 tkinter "Index Error: list index out of range" 【发布时间】:2015-01-14 03:58:34 【问题描述】:

我正在尝试将一些值和名称作为一个小项目保存和加载,但我在加载部分遇到了一些问题 我正在使用 PYTHON 3.4 和 tkinter 创建 4 个文本框,2 个用于名称,2 个用于值,2 个按钮用于保存和加载我放在这些文本框中的内容 我可以在这些文本框中写任何东西,所以可以说我放了

苹果 20

橙色 40

所以在我的前 2 个文本框中,我在另外 2 个文本框中有 2 个字符串和整数 所以我的代码是

import time
import serial
import sys
import os
import tkinter as tk
from tkinter import ttk
from tkinter import *
from tkinter import messagebox
from tkinter import filedialog
from tkinter.filedialog import askopenfilename
from tkinter.filedialog import asksaveasfilename
from tkinter.messagebox import showerror
try:
  import Tkinter              # Python 2
  import ttk
except ImportError:
  import tkinter as Tkinter   # Python 3
  import tkinter.ttk as ttk
mGui = Tk()
mGui.title("trying")
mGui.geometry('1250x650+10+10')
def mSave():
  filename = asksaveasfilename(defaultextension='.txt',filetypes = (('Text files', '*.txt'),    ('Python files', '*.py *.pyw'),('All files', '*.*')))
  if filename is None:
    return
  file = open (filename, mode = 'w')
  NameVal_1 = name1.get()
  NameVal_2 = name2.get()
  Vol_Val_1 = value1.get()
  Vol_Val_2 = value2.get()

  all =   (NameVal_1 + "," + (str(Vol_Val_1)) + ","
         + NameVal_2 + "," + (str(Vol_Val_2)))
  file.write(all)
  file.close()

def mLoad():
  filenamel = askopenfilename()
  if filenamel is None:
    return
  (NameVal_1, Vol_Val_1,
   NameVal_2, Vol_Val_2)   = (x.split(",")[3] for x in filenamel)

  name1.set(NameVal_1)
  name2.set(NameVal_2)
  value1.set(Vol_Val_1)
  value2.set(Vol_Val_2)
  file.close()

value1 = IntVar()
value2 = IntVar()
name1 = StringVar()
name2 = StringVar()

mButtonSave = Button(mGui, text = "Save Data", command = mSave, fg = 'Red').place(x=550,y=80)
mButtonLoad = Button(mGui, text = "Load Data", command = mLoad, fg = 'Red').place(x=550,y=110)

tText1 = Entry(mGui, textvariable = name1).place(x=10,y=80)
tText2 = Entry(mGui, textvariable = name2).place(x=10,y=100)
vText1 = Entry(mGui, textvariable = value1).place(x=200,y=80)
vText2 = Entry(mGui, textvariable = value2).place(x=200,y=100)

保存正常,我可以创建一个存档 .txt 来显示

apple,20,orange,40

但是当我尝试将这些值放入文本框中时,我不能 蟒蛇说

IndexError: list index out of range

我只想,当四个文本框为空并按下按钮加载时,将苹果放在文本框 1 中,将 20 放在文本框 2 中,将橙色放在文本框 3 中,将 40 再次放在文本框 4 中

我该怎么办?请帮忙

已编辑

这是最终代码,谢谢

import time
import serial
import sys
import os
import tkinter as tk
from tkinter import ttk
from tkinter import *
from tkinter import messagebox
from tkinter import filedialog
from tkinter.filedialog import askopenfilename
from tkinter.filedialog import asksaveasfilename
from tkinter.messagebox import showerror
try:
  import Tkinter              # Python 2
  import ttk
except ImportError:
  import tkinter as Tkinter   # Python 3
  import tkinter.ttk as ttk
mGui = Tk()
mGui.title("trying")
mGui.geometry('1250x650+10+10')
def mSave():
  filename = asksaveasfilename(defaultextension='.txt',filetypes = (('Text files', '*.txt'),    ('Python files', '*.py *.pyw'),('All files', '*.*')))
  if filename is None:
    return
  file = open (filename, mode = 'w')
  NameVal_1 = name1.get()
  NameVal_2 = name2.get()
  Vol_Val_1 = value1.get()
  Vol_Val_2 = value2.get()

  all =   (NameVal_1 + "," + (str(Vol_Val_1)) + ","
         + NameVal_2 + "," + (str(Vol_Val_2)))
  file.write(all)
  file.close()

def mLoad():
  filenamel = askopenfilename()
  if filenamel is None:
    return
  with open(filenamel, 'r') as f:
    x = f.readline()  # read the first line
    (NameVal_1, Vol_Val_1,  NameVal_2, Vol_Val_2) = x.split(",")  

  name1.set(NameVal_1)
  name2.set(NameVal_2)
  value1.set(Vol_Val_1)
  value2.set(Vol_Val_2)
  filename.close()

value1 = IntVar()
value2 = IntVar()
name1 = StringVar()
name2 = StringVar()

mButtonSave = Button(mGui, text = "Save Data", command = mSave, fg = 'Red').place(x=550,y=80)
mButtonLoad = Button(mGui, text = "Load Data", command = mLoad, fg = 'Red').place(x=550,y=110)

tText1 = Entry(mGui, textvariable = name1).place(x=10,y=80)
tText2 = Entry(mGui, textvariable = name2).place(x=10,y=100)
vText1 = Entry(mGui, textvariable = value1).place(x=200,y=80)
vText2 = Entry(mGui, textvariable = value2).place(x=200,y=100)

【问题讨论】:

【参考方案1】:

filenamel = askopenfilename() 只给你一个文件的路径。它实际上并不读取文件。因此,您需要打开它并阅读。此外,如果您的文件中只有一行,例如您的示例,则此 (x.split(",")[3] for x in filenamel) 将不起作用,因为它遍历文件路径中的字母,而不是文件中的行。您应该在mLoad() 中执行以下操作:

# open the file for reading
with open(filenamel, 'r') as f:
    x = f.readline()  # read the first line   

# split it by ',' and assing to appropriate variables.
(NameVal_1, Vol_Val_1,  NameVal_2, Vol_Val_2) = x.split(",")

【讨论】:

完美,现在如果不是一行用 "," 分隔的几个单词,而是用 "\n" 分隔的列并且没有逗号? x = f.readlines() 会将所有行读入列表中。所以你需要迭代这个列表并进行拆分。与您在问题中尝试的类似。

以上是关于如何在 python 3.4 tkinter“索引错误:列表索引超出范围”中修复此错误的主要内容,如果未能解决你的问题,请参考以下文章

Windows 上 Python 3.4 中的 Tkinter 不会在退出时将内部剪贴板数据发布到 Windows 剪贴板

python 3.4 中原来的tkMessageBox变成什么了?

如何使用 tkinter 按钮在 python 中写入文件?

如何在 Python 2.7 中使用 tkinter 库 [关闭]

python中tkinter treeview如何获取选中的条目

python tkinter如何设置组件在窗口中的位置,比如说一个按钮,我希望这个按钮在窗口的左边,上边………