I/O错误,无法在listbox上实现文件

2024-10-06 07:17:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了这段代码,控制台出现了一个错误,我尝试了几种无法修复的方法,你能解释一下我的错误在哪里吗。多谢各位

import os
os.chdir(r"C:\Users\Umer Selmani\Desktop\prog.practice\MP1")

import csv


with open('FoodDB.csv','r') as FDB:
    file = csv.reader(FDB)
    for line in file:
        print(line)

from tkinter import *

class Diet:
    def __init__(self):
        self.Left = Frame(root,width= 250,height=200,bg='salmon')
        self.Left.pack(side=LEFT,pady=5)

        self.labelrdL=Label(self.Left, text="Food Menu").grid(row=0)
        self.listboxrdL=Listbox(self.Left,width=30).grid(row=1)
        for q in file:
            self.listboxrdL.insert(END,q)
        self.buttonrdL=Button(self.Left, text="Continue",bg="red").grid(row=2)

root = Tk()
diet = Diet()   # Create an instance of Diet.
root.mainloop()

这里有一个错误

Traceback (most recent call last):
  File "C:/Users/Umer Selmani/.PyCharmEdu2018.2/config/scratches/scratch_3.py", line 26, in <module>
    diet = Diet()   # Create an instance of Diet.
  File "C:/Users/Umer Selmani/.PyCharmEdu2018.2/config/scratches/scratch_3.py", line 21, in __init__
    for q in file:
ValueError: I/O operation on closed file.

Process finished with exit code 1

Tags: csvinimportselffor错误lineroot
2条回答

这里有几件事你需要做

您应该遵循PEP8准则来命名变量。在文件开头定义所有导入。最后也是最重要的一点是,在更新列表框时,应该使用with open语句。请记住,与open对应的with open将在with语句结束后自动关闭文件

此外,此处的这一行self.listboxrdL = Listbox(self.Left,width=30).grid(row=1)将阻止您向列表框添加信息

通过执行以下操作,确保在新行上使用几何图形管理器以防止出现问题:

self.listboxrdL = Listbox(self.Left,width=30)
self.listboxrdL.grid(row=1)

代码:

import os
import csv
import tkinter as tk
os.chdir(r"C:\Users\Umer Selmani\Desktop\prog.practice\MP1")

class Diet:
    def __init__(self):
        self.left = tk.Frame(root, width=250, height=200, bg='salmon')
        self.left.pack(side="left", pady=5)

        tk.Label(self.left, text="Food Menu").grid(row=0)
        self.listbox_rdl = tk.Listbox(self.left, width=30)
        self.listbox_rdl.grid(row=1)

        with open('FoodDB.csv', 'r') as fdb:
            file = csv.reader(fdb)
            for q in file:
                self.listbox_rdl.insert("end", q)

        tk.Button(self.left, text="Continue", bg="red").grid(row=2)

root = tk.Tk()
diet = Diet()
root.mainloop()

您的“打开”将自动关闭文件。因此,您得到了错误

代替with open('FoodDB.csv','r') as FDB:试试FDB = open('FoodDB.csv','r')

完成后不要忘记手动关闭文件

FDB.close()

完整解决方案应如下所示:

import os
os.chdir(r"C:\Users\Umer Selmani\Desktop\prog.practice\MP1")

import csv


FDB = open('FoodDB.csv','r')
file = csv.reader(FDB)
#for line in file:
   #print(line)

from tkinter import *

class Diet:
    def __init__(self):
        self.Left = Frame(root,width= 250,height=200,bg='salmon')
        self.Left.pack(side=LEFT,pady=5)

        self.labelrdL=Label(self.Left, text="Food Menu").grid(row=0)
        self.listboxrdL=Listbox(self.Left,width=30).grid(row=1)
        for q in file:
            self.listboxrdL.insert(END,q)
        self.buttonrdL=Button(self.Left, text="Continue",bg="red").grid(row=2)

root = Tk()
diet = Diet()   # Create an instance of Diet.
root.mainloop()

相关问题 更多 >