2015-01-14 3 views
1

Я пытаюсь сохранить и загрузить некоторые значения и имена в качестве небольшого объекта, но у меня есть некоторые проблемы с частью загрузки Я используя PYTHON 3.4 и tkinter для создания 4 текс-боксов, 2 для имен и 2 для значений и 2 кнопки для сохранения и загрузки того, что я помещаю в эти текстовые поля. Я могу писать в этих текстовых окнах что угодно, так что, скажем, я помещаюКак исправить эту ошибку в python 3.4 tkinter «Ошибка индекса: индекс индекса вне диапазона»

яблоко 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 

, но когда я пытаюсь поставить эти значения в текстовых полях, I может не питон говорит

IndexError: list index out of range 

Я просто хочу, когда четыре Textboxes пустые и жму кнопку Load, чтобы положить яблоко в текстовом поле 1 , 20 в текстовом поле 2, оранжевый в текстовом поле 3 и 40 в текстовом поле 4 снова

Что делать? любая помощь, пожалуйста,

EDITED

Это окончательный код, благодаря

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(",") 
+0

идеально, теперь, если вместо одной линии несколько слов, разделенных «» я столбцы разделены „\ п“ и не запятые? –

+0

'x = f.readlines()' будет читать все строки в списке. Поэтому вам нужно перебирать этот список и делать расщепление. Как вы пытались в своем вопросе. – Marcin

Смежные вопросы