我是 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
我需要開發代碼來執行以下操作
? 驗證條目小部件(即,接受每個文本框的有效輸入)。例如,僅接受年齡和手機號碼的數字,反之亦然(即不接受姓名、性別、職位的數字)-顯示無效輸入的訊息框
這是代碼
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()
uj5u.com熱心網友回復:
驗證資料 您可以使用按鈕回呼放置一個文本驗證函式Add Record,這樣當用戶單擊添加記錄時,它首先檢查每個輸入欄位以確保滿足某些條件。
例如,我添加了一個 validate_text 函式,當單擊添加記錄按鈕時,該函式在每個條目小部件文本上呼叫。它首先確保條目沒有留空,然后僅檢查年齡和數字欄位的數字,然后檢查其余部分以確保文本中沒有數字。如果任何條件為真,那么它會顯示一個錯誤訊息框,并且不會將任何記錄添加到 main_lst 或 csv 檔案。否則,它將記錄添加到 main_lst 和 gui。
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 = '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 validate_text(field, text):
if not text:
messagebox.showinfo("Invalid Entry","Values cannot be left blank.")
return False
elif field in ["number", "age"]:
if not text.isnumeric():
messagebox.showinfo("Invalid Entry", f"{field.title()} must be numeric.")
return False
elif not all([not i.isdigit() for i in text]):
messagebox.showinfo("Invalid Entry", f"Numbers not permitted in {field.title()} field.")
return False
return True
def Add():
entries = {"name": Nametxt, "age": Agetxt, "gender": Gendertxt, "position": Positiontxt, "number": Numbertxt,"address": Addresstxt}
values = []
for key, val in entries.items():
text = val.get()
if not validate_text(key, text):
return
values.append(text)
main_lst.append(values)
listbox1.insert(len(List_of_Name), values[0]) # add it to the listbox list
List_of_Name.append(values[0]) # 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/qita/504268.html
