如何将 CSV 文件中的所有数据导入 GUI

2023-12-24

我是 Python 新手,想要实现一个简单的员工管理系统(如附图所示),该系统具有以下功能

• 用于输入、查看和导出员工数据的GUI。(已经完成)

• 将数据导出到Excel 或csv 文件的能力。(已经完成但有问题-解释如下)

• 能够将Excel 或csv 文件中的所有数据导入GUI。

这是 GUI 的示例

这是 CSV 文件

    Fullname            Age Gender  Position              Phone Number  Address
    Ali Talib           59  Male    Vice-Chancellor       1752555555    UK-London
    Afaf Neamah         23  Female  Manager               7912394404    UK-Plymouth
    Hussein Neamah      22  Male    Head of Department    7335952523    UK-London
    Estabraq Aldalboos  33  Female  Engineer              7575252324    UK-Plymouth
    Nathan Clarke       45  Male    Deputy Head of School 7916682090    UK-London
    Neamah AL-Naffakh   37  Male    Lecturer              7817792202    UK-Plymouth

我需要开发代码来执行以下操作

I am目前有问题。每次实施后,代码都会覆盖 CSV 文件。例如,假设 CSV 文件中有 10 条记录。一旦我关闭或退出Python,并再次运行系统,它将存储最新的记录并删除所有旧记录(用旧日期覆盖新输入)

I need一种从 CSV 导入所有数据并将其放置在列表或文本框中的更好方法(或任何建议,我们非常感激)。

这是代码

import csv 
from csv import *
from tkinter import *
from tkinter import filedialog
import tkinter.messagebox


window=Tk()                                               #1-1
window.geometry("800x500+0+0")                                #1-2
window.title("Employee Management System")
window.maxsize(width=800,height=500)
window.minsize(width=800,height=500)
main_lst=[]

# add the column value into the list 

FilePath = '/Users/nhal-naffakh/Desktop/Desktop/Sec-Interview/Data.csv'
# Create file object that open the file located in FilePath and store the file info in the object
File=open(FilePath)
# Create Object that read the csv file
# Convert each row in the CSV file into list of string and store it in Object
Reader=csv.reader(File) 
Data=list(Reader)
del(Data[0])                                             #1-5 Delete title of the first row in the CSV

#print(Data[5][1])

# Create set of Functions 
def view():                                              #1-8
  index=listbox1.curselection()[0]
  NameLabel2.config(text=Data[index][0])
  AgeLabel2.config(text=Data[index][1])
  GenderLabel2.config(text=Data[index][2])
  PositionLabel2.config(text=Data[index][3])
  AddressLabel2.config(text=Data[index][4])
  return None

def OpenFile():
    filepath=filedialog.askopenfilename()
#   print(filepath)
# OR
    file=open(filepath,'r')
    print(file.read()) 
    file.close
    
def Add():
   lst=[Nametxt.get(),Agetxt.get(),Gendertxt.get(),Positiontxt.get(),Numbertxt.get(),Addresstxt.get()]
   main_lst.append(lst)
   messagebox.showinfo("Information","The data has been added successfully")
   
def Save():
   with open("Data.csv","w") as file:
      Writer=writer(file)
      Writer.writerow(["Fullname","Age","Gender","Position","Phone Number","Address"])
      Writer.writerows(main_lst)
      messagebox.showinfo("Information","Saved succesfully")
            
def Clear():
   Nametxt.delete(0,END)
   Agetxt.delete(0,END)
   Gendertxt.delete(0,END)
   Positiontxt.delete(0,END)
   Numbertxt.delete(0,END)
   Addresstxt.delete(0,END)

def Exit():
    wayOut = tkinter.messagebox.askyesno("Employee Management System", "Do you want to exit the system")
    if wayOut > 0:
        window.destroy()
        return
   
# extract entire column into List to show it on GUI later 
List_of_Name=[]
for x in list(range(0,len(Data))):
    #print(Data[x][0])
    List_of_Name.append(Data[x][0])    
    var=StringVar(value=List_of_Name)                   #1-3
    listbox1=Listbox(window,listvariable=var) #1-4 Modified by adding var
    listbox1.grid(row=3,column=0)
    
    buttonView=Button(text="ViewRecord",padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                      width=8,fg='black',bg="dark gray",command=view).grid(row=3,column=1)                     #1-7
     
    # Label Widget
    NameLabel=Label(window,text="FullName").grid(row=5,column=0,sticky="w")        #1-9
    AgeLabel=Label(window,text="Age").grid(row=6,column=0,sticky="w")
    GenderLabel=Label(window,text="Gender").grid(row=7,column=0,sticky="w")
    PositionLabel=Label(window,text="Position").grid(row=8,column=0,sticky="w")
    AddressLabel=Label(window,text="Address").grid(row=9,column=0,sticky="w")
    
    
    NameLabel2=Label(window,text="")        #1-10
    NameLabel2.grid(row=5,column=1,sticky="w")
    AgeLabel2=Label(window,text="")
    AgeLabel2.grid(row=6,column=1,sticky="w")
    GenderLabel2=Label(window,text="")
    GenderLabel2.grid(row=7,column=1,sticky="w")
    PositionLabel2=Label(window,text="")
    PositionLabel2.grid(row=8,column=1,sticky="w")
    AddressLabel2=Label(window,text="")
    AddressLabel2.grid(row=9,column=1,sticky="w")

    # Label Widget & Entry Widget    #1-10
    Namelabel3=Label(window,text="Full Name",font=('arial',12,'bold'),bd=3,fg="white",
                     bg="dark blue",).grid(row=0,column=0,sticky="w")
    Nametxt=Entry(window,font=('ariel',12),bd=4,width=22, justify='left')
    Nametxt.grid(row=0,column=1)
    
    Agelabel3=Label(window,text="Age",font=("ariel",12,'bold'),bd=3,fg='white',
                    bg="dark blue",).grid(row=0,column=2)
    Agetxt=Entry(window,font=('ariel',12),bd=4, justify='left')
    Agetxt.grid(row=0,column=3)
    
    GenderLabel3=Label(window,text="Gender",font=('ariel',12,'bold'),bd=3,fg='white',
                    bg="dark blue").grid(row=1,column=0,sticky="w")
    Gendertxt=Entry(window,font=('ariel',12),bd=4, justify='left')
    Gendertxt.grid(row=1,column=1)
    
    PositionLabel3=Label(window,text="Position",font=('ariel',12,'bold'),bd=3,fg='white',
                    bg="dark blue").grid(row=1,column=2,sticky="w")
    Positiontxt=Entry(window,font=('ariel',12),bd=4, justify='left')
    Positiontxt.grid(row=1,column=3)
    
    NumberLabel3=Label(window,text="Mob Number",font=('ariel',12,'bold'),bd=3,fg='white',
                    bg="dark blue").grid(row=2,column=0,sticky="w")
    Numbertxt=Entry(window,font=('ariel',12),bd=4, justify='left')
    Numbertxt.grid(row=2,column=1)
    
    AddressLabel3=Label(window,text="Address",font=('ariel',12,'bold'),bd=3,fg='white',
                    bg="dark blue").grid(row=2,column=2,sticky="w")
    Addresstxt=Entry(window,font=('ariel',12),bd=4, justify='left')
    Addresstxt.grid(row=2,column=3)

    #  Button
    LoadButton=Button(text="Load File", padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                      width=8,fg='black',bg="dark gray", command=OpenFile).grid(row=3,column=2)
    AddButton=Button(text="Add Record", padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                     width=8,fg='black',bg="dark gray",command=Add).grid(row=3,column=3)
    SaveButton=Button(text="Save", padx=10, pady=4, bd=4, font=('ariel',12,'bold'), 
                      width=8,fg='black',bg="dark gray",command=Save).grid(row=4,column=1)
    ClearButton=Button(text="Clear", padx=10, pady=4, bd=4, font=('ariel',12,'bold'), 
                       width=8,fg='black',bg="dark gray",command=Clear).grid(row=4,column=2)
    ExitButton=Button(text="Exit", padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                      width=8,fg='black', bg="dark gray",command=Exit).grid(row=4,column=3)

window.mainloop()

问题是您的信息存储在Data您在程序启动时加载的变量,然后您就有了 main_list,它是您添加新条目时填充的内容。当您退出或保存程序时,仅将 main_list 中的内容保存到 csv 文件中,并完全忽略Data变量,从而删除启动程序之前列表中的任何内容。

只需将两个列表合并为一个列表即可轻松解决此问题main_list它由程序启动时 csv 文件中的内容以及程序执行期间添加新记录填充。您还需要在添加新记录时将新名称存储在列表框1中,只需将文本插入到列表框本身即可Add功能

例如:

我做了一些内联注释并修复了一些缩进问题。

import csv
from tkinter import *
from tkinter import messagebox

def load_data(path):      # Load data from csv file at program start.
    reader = csv.reader(open(path))
    return list(reader)[1:]

window=Tk()
window.geometry("800x500+0+0")
window.title("Employee Management System")
window.maxsize(width=800,height=500)
window.minsize(width=800,height=500)
FILEPATH = '/Users/nhal-naffakh/Desktop/Desktop/Sec-Interview/Data.csv'

main_lst = load_data(FILEPATH)  # Load csv data into `main_lst`


def view():
  index = listbox1.curselection()[0]
  NameLabel2.config(text=main_lst[index][0])
  AgeLabel2.config(text=main_lst[index][1])
  GenderLabel2.config(text=main_lst[index][2])
  PositionLabel2.config(text=main_lst[index][3])
  AddressLabel2.config(text=main_lst[index][4])

def OpenFile():
    pass

def Add():
   name = Nametxt.get()  # get the name of new entry
   lst = [name, Agetxt.get(), Gendertxt.get(), Positiontxt.get(), Numbertxt.get(), Addresstxt.get()]
   main_lst.append(lst)
   listbox1.insert(len(List_of_Name), name)  # add it to the listbox list
   List_of_Name.append(name)  # store it in the list of names
   messagebox.showinfo("Information","The data has been added successfully")

def Save():
   with open(FILEPATH,"w") as file:
      writer = csv.writer(file, lineterminator='\n')
      writer.writerow(["Fullname","Age","Gender","Position","Phone Number","Address"])
      writer.writerows(main_lst)  #  now when it writes to file it will contain all the data.
      messagebox.showinfo("Information","Saved succesfully")

def Clear():
   Nametxt.delete(0,END)
   Agetxt.delete(0,END)
   Gendertxt.delete(0,END)
   Positiontxt.delete(0,END)
   Numbertxt.delete(0,END)
   Addresstxt.delete(0,END)

def Exit():
    wayOut = messagebox.askyesno("Employee Management System", "Do you want to exit the system")
    if wayOut > 0:
        Save()  # Added a call to save upon exiting.
        window.destroy()
        return

List_of_Name=[]
for x in list(range(0,len(main_lst))):
    List_of_Name.append(main_lst[x][0])

var = StringVar(value=List_of_Name)
listbox1 = Listbox(window, listvariable=var)
listbox1.grid(row=3,column=0)

buttonView = Button(text="ViewRecord", padx=10, pady=4, bd=4,
                    font=('ariel',12,'bold'), width=8, fg='black',
                    bg="dark gray", command=view).grid(row=3,column=1)
NameLabel = Label(window,text="FullName").grid(row=5,column=0,sticky="w")
AgeLabel=Label(window,text="Age").grid(row=6,column=0,sticky="w")
GenderLabel=Label(window,text="Gender").grid(row=7,column=0,sticky="w")
PositionLabel=Label(window,text="Position").grid(row=8,column=0,sticky="w")
AddressLabel=Label(window,text="Address").grid(row=9,column=0,sticky="w")
NameLabel2=Label(window,text="")
NameLabel2.grid(row=5,column=1,sticky="w")
AgeLabel2=Label(window,text="")
AgeLabel2.grid(row=6,column=1,sticky="w")
GenderLabel2=Label(window,text="")
GenderLabel2.grid(row=7,column=1,sticky="w")
PositionLabel2=Label(window,text="")
PositionLabel2.grid(row=8,column=1,sticky="w")
AddressLabel2=Label(window,text="")
AddressLabel2.grid(row=9,column=1,sticky="w")
Namelabel3=Label(window,text="Full Name",
                    font=('arial',12,'bold'),bd=3,fg="white",
                    bg="dark blue",).grid(row=0,column=0,sticky="w")
Nametxt = Entry(window,font=('ariel',12),bd=4,width=22, justify='left')
Nametxt.grid(row=0,column=1)

Agelabel3=Label(window,text="Age",font=("ariel",12,'bold'),bd=3,fg='white',
                bg="dark blue",).grid(row=0,column=2)
Agetxt=Entry(window,font=('ariel',12),bd=4, justify='left')
Agetxt.grid(row=0,column=3)

GenderLabel3=Label(window,text="Gender",font=('ariel',12,'bold'),bd=3,fg='white',
                bg="dark blue").grid(row=1,column=0,sticky="w")
Gendertxt=Entry(window,font=('ariel',12),bd=4, justify='left')
Gendertxt.grid(row=1,column=1)

PositionLabel3=Label(window,text="Position",font=('ariel',12,'bold'),bd=3,fg='white',
                bg="dark blue").grid(row=1,column=2,sticky="w")
Positiontxt=Entry(window,font=('ariel',12),bd=4, justify='left')
Positiontxt.grid(row=1,column=3)

NumberLabel3=Label(window,text="Mob Number",font=('ariel',12,'bold'),bd=3,fg='white',
                bg="dark blue").grid(row=2,column=0,sticky="w")
Numbertxt=Entry(window,font=('ariel',12),bd=4, justify='left')
Numbertxt.grid(row=2,column=1)

AddressLabel3=Label(window,text="Address",font=('ariel',12,'bold'),bd=3,fg='white',
                bg="dark blue").grid(row=2,column=2,sticky="w")
Addresstxt=Entry(window,font=('ariel',12),bd=4, justify='left')
Addresstxt.grid(row=2,column=3)

#  Button
LoadButton=Button(text="Load File", padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                    width=8,fg='black',bg="dark gray", command=OpenFile).grid(row=3,column=2)
AddButton=Button(text="Add Record", padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                    width=8,fg='black',bg="dark gray",command=Add).grid(row=3,column=3)
SaveButton=Button(text="Save", padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                    width=8,fg='black',bg="dark gray",command=Save).grid(row=4,column=1)
ClearButton=Button(text="Clear", padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                    width=8,fg='black',bg="dark gray",command=Clear).grid(row=4,column=2)
ExitButton=Button(text="Exit", padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                    width=8,fg='black', bg="dark gray",command=Exit).grid(row=4,column=3)

window.mainloop()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 CSV 文件中的所有数据导入 GUI 的相关文章

  • 如何使用 Pycharm 运行 fast-api 服务器?

    我有一个简单的 API 函数 如下所示 from fastapi import FastAPI app FastAPI app get async def read root return Hello World 我正在使用启动服务器uvi
  • 在 ubuntu 中卸载 python 模块

    我必须删除一个名为 django 的 python 模块 一种流行的模块 因为我安装了错误的版本 1 3 py 2 6 中的 beta 如何卸载这个模块 请解释一下 因为我只在 Windows 中使用过 python 而从未在 Ubuntu
  • 如何检查给定的数字是否是2的幂?

    下面的代码不适用于某些输入 a i set 1 while i lt 10000 a add i i lt lt 1 N int input if N in a print True else print False 我最初的想法是检查每个
  • FastAPI UploadFile 与 Flask 相比慢

    我创建了一个端点 如下所示 app post report upload def create upload files files UploadFile File try with open files filename wb as wf
  • 在Python中,如何通过去掉括号和大括号来打印Json

    我想以一种很好的方式打印 Json 我想去掉方括号 引号和大括号 只使用缩进和行尾来显示 json 的结构 例如 如果我有一个像这样的 Json A A1 1 A2 2 B B1 B11 B111 1 B112 2 B12 B121 1
  • pandas DataFrame 中行的高效成对比较

    我目前正在处理一个较小的数据集 大约 900 万行 不幸的是 大多数条目都是字符串 即使强制类别 框架在内存中也只有几 GB 我想做的是将每一行与其他行进行比较 并对内容进行直接比较 例如 给定 A B C D 0 cat blue old
  • Python正则表达式替换引号中的文本(引号本身除外)

    例如 我有一个测试字符串 content I opened my mouth Good morning I said cheerfully 我想使用正则表达式删除双语音标记之间的文本 但不删除语音标记本身 所以它会返回 I opened m
  • 如何使用 Python 在表单中选择选项?

    我想知道如何以格式如下的形式选择选项 td align left td
  • 如何停止 PythonShell

    如何终止 停止 Node js 中 PythonShell 执行的 Python 脚本的执行 我在交互模式下运行 输出通过 socket io 发送到给定的房间 如果没有更多的客户端连接到这个房间 我想停止 python 脚本的执行 这是我
  • 如何在 tkinter 后台运行函数[重复]

    这个问题在这里已经有答案了 我是 GUI 编程新手 我想用 tkinter 编写一个 Python 程序 我想要它做的就是在后台运行一个可以通过 GUI 影响的简单函数 该函数从 0 计数到无穷大 直到按下按钮为止 至少这是我想要它做的 但
  • 使用 Popen 打开进程并获取 PID

    我正在开发一个漂亮的小功能 def startProcess name path Starts a process in the background and writes a PID file returns integer pid Ch
  • 哈希 freezeset 与排序元组

    在 Python 中 给定一组可比较的 可散列的元素s 散列是否更好frozenset s or tuple sorted s 这取决于你在做什么 创建一个更快frozenset 比排序tuple but frozenset占用的内存比tu
  • Python:如何“杀死”类实例/对象?

    我希望 Roach 类在达到一定量的 饥饿 时 死亡 但我不知道如何删除该实例 我的术语可能有误 但我的意思是 窗户上有大量 蟑螂 我希望特定的蟑螂完全消失 我会向您展示代码 但它很长 我将蟑螂类添加到策划者类蟑螂种群列表中 一般来说 每个
  • 从函数在 python 3 中创建全局变量

    我想知道为什么在函数结束后我无法访问变量 variable for raw data 代码是这样的 def htmlfrom Website URL import urllib request response urllib request
  • 如何通过 API Gateway 使用事件调用类型调用 Lambda 函数?

    文件说 默认情况下 Invoke API 采用 RequestResponse 调用类型 您可以选择通过将 Event 指定为 InitationType 来请求异步执行 因此 我可以发送到我的函数 python 的就是到处都是 Inspi
  • 为什么我的 Python 散点图不起作用?

    我使用 pylab 创建了一个非常简单的散点图 pylab scatter engineSize fuelMile pylab show 该程序的其余部分不值得发布 因为正是该行给我带来了问题 当我将 散点 更改为 绘图 时 它会绘制数据图
  • 阻止 BeautifulSoup 将我的 XML 标签转换为小写

    我正在使用 BeautifulStoneSoup 来解析 XML 文档并更改一些属性 我注意到它会自动将所有 XML 标签转换为小写 例如我的源文件有
  • Python 中的可逆 STFT 和 ISTFT

    有没有通用的形式短时傅立叶变换 https en wikipedia org wiki Short time Fourier transform与内置于 SciPy 或 NumPy 或其他什么中的相应逆变换 这是pyplotspecgram
  • 从 HDF5 文件中删除信息

    我意识到 SO 用户以前曾问过这个问题question https stackoverflow com questions 1124994 removing data from a hdf5 file rq 1但它是在 2009 年被问到的
  • 处理错误“TypeError: Expected tuple, got str”将 CSV 加载到 pandas 多级和多索引 (pandas)

    我正在尝试加载 CSV 文件 这个文件 https drive google com file d 13a eVeSzy6HkhffQw32S57U hm5YCj0 view usp sharing 创建一个多索引多级数据帧 它有5 五 指

随机推荐