我是 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
我需要開發代碼來執行以下操作
?我目前有問題。每次實施后,代碼都會覆寫 CSV 檔案。例如,假設我在 CSV 檔案中有 10 條記錄。一旦我關閉或退出 Python,并再次運行系統,它將存盤最新記錄并洗掉所有舊記錄(用舊日期覆寫新輸入)
?我需要一種更好的方法來從 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()
uj5u.com熱心網友回復:
問題是您將資訊存盤在Data
程式啟動時加載的變數中,然后您擁有 main_list,這是添加新條目時填充的內容。當您退出或保存程式時,只會將 main_list 中的內容保存到 csv 檔案中,并完全忽略Data
變數的內容,從而在啟動程式之前洗掉串列中的任何內容。
這可以通過簡單地將兩個串列合并為一個串列來輕松解決,該串列main_list
由程式啟動時 csv 檔案中的內容填充,并在程式執行期間添加新記錄。您還需要在添加新記錄時將新名稱存盤在 listbox1 中,只需將文本插入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()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/503686.html
上一篇:1HTML5--擁抱未來
下一篇:自定義型別的XSD1.0驗證失敗