From 62d26943e795ab97fcafe133cba92e914189447a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=9D=A8?= <3379620152@qq.com> Date: Sun, 2 Jun 2024 06:20:01 +0800 Subject: [PATCH] * --- .idea/.idea/.gitignore | 8 - .../inspectionProfiles/profiles_settings.xml | 6 - .idea/.idea/misc.xml | 7 - .idea/.idea/modules.xml | 8 - .idea/.idea/pythonProject1.iml | 10 - .idea/main.py | 395 ----------- .idea/misc.xml | 4 +- .idea/modules.xml | 2 +- ...onProject1.iml => pythonProject职工.iml} | 2 +- main.py | 613 +++++++----------- 10 files changed, 232 insertions(+), 823 deletions(-) delete mode 100644 .idea/.idea/.gitignore delete mode 100644 .idea/.idea/inspectionProfiles/profiles_settings.xml delete mode 100644 .idea/.idea/misc.xml delete mode 100644 .idea/.idea/modules.xml delete mode 100644 .idea/.idea/pythonProject1.iml delete mode 100644 .idea/main.py rename .idea/{pythonProject1.iml => pythonProject职工.iml} (75%) diff --git a/.idea/.idea/.gitignore b/.idea/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/.idea/inspectionProfiles/profiles_settings.xml b/.idea/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/.idea/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/.idea/misc.xml b/.idea/.idea/misc.xml deleted file mode 100644 index 2259309..0000000 --- a/.idea/.idea/misc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/.idea/modules.xml b/.idea/.idea/modules.xml deleted file mode 100644 index fdd8fdf..0000000 --- a/.idea/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/.idea/pythonProject1.iml b/.idea/.idea/pythonProject1.iml deleted file mode 100644 index f263dd1..0000000 --- a/.idea/.idea/pythonProject1.iml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/main.py b/.idea/main.py deleted file mode 100644 index 107b767..0000000 --- a/.idea/main.py +++ /dev/null @@ -1,395 +0,0 @@ -# This is a sample Python script. - -# Press Shift+F10 to execute it or replace it with your code. -# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. -from tkinter import * -from tkinter import font -from tkinter import messagebox -from os import path -from os import remove - - - -class PopupWindow(object): - - def __init__(self, master, main_window, title, contact=None): - self.main_window = main_window - top = self.top = Toplevel(master) - top.title(title) - top.resizable(False, False) - w = 280 - h = 500 - top.geometry('%dx%d+%d+%d' % (w, h, (ws - w) / 2, (hs - h) / 2)) - top.bind('', lambda event: top.destroy()) - - m_font = font.Font(size=16) - l = Label(top, text="工号:", font=m_font) - l.pack(side=TOP, pady=5) - self.e1 = Entry(top) - self.e1.pack(side=TOP, padx=16, ipady=3, fill=X) - self.e1.focus() - if contact is not None: - self.e1.insert(0, contact.number) - - l2 = Label(top, text="姓名:", font=m_font) - l2.pack(side=TOP, pady=5) - self.e2 = Entry(top) - self.e2.pack(side=TOP, padx=16, ipady=3, fill=X) - if contact is not None: - self.e2.insert(0, contact.name) - - l2 = Label(top, text="性别:", font=m_font) - l2.pack(side=TOP, pady=5) - self.e3 = Entry(top) - self.e3.pack(side=TOP, padx=16, ipady=3, fill=X) - if contact is not None: - self.e3.insert(0, contact.sex) - - l2 = Label(top, text="出生日期:", font=m_font) - l2.pack(side=TOP, pady=5) - self.e4 = Entry(top) - self.e4.pack(side=TOP, padx=16, ipady=3, fill=X) - if contact is not None: - self.e4.insert(0, contact.birth) - - l2 = Label(top, text="入职时间:", font=m_font) - l2.pack(side=TOP, pady=5) - self.e5 = Entry(top) - self.e5.pack(side=TOP, padx=16, ipady=3, fill=X) - if contact is not None: - self.e5.insert(0, contact.entry_time) - - l2 = Label(top, text="职位:", font=m_font) - l2.pack(side=TOP, pady=5) - self.e6 = Entry(top) - self.e6.pack(side=TOP, padx=16, ipady=3, fill=X) - if contact is not None: - self.e6.insert(0, contact.position) - - l2 = Label(top, text="工资:", font=m_font) - l2.pack(side=TOP, pady=5) - self.e7 = Entry(top) - self.e7.pack(side=TOP, padx=16, ipady=3, fill=X) - if contact is not None: - self.e7.insert(0, contact.salary) - - if contact is None: - b2 = Button(top, text='添加', width=12, command=lambda: self.add_click(None)) - self.e7.bind('', self.add_click) - else: - b2 = Button(top, text='编辑', width=12, command=lambda: self.edit_click(None)) - self.e7.bind('', self.edit_click) - b2.pack(side=LEFT, pady=10, padx=20) - b3 = Button(top, text='取消', width=12, command=lambda: top.destroy()) - b3.pack(side=RIGHT, pady=10, padx=20) - - top.grab_set() - - - def edit_click(self, event): - e1_number = self.e2.get() - if not e1_number: - messagebox.showinfo("出错了", '名字不能为空!') - return - e2_name = self.e3.get() - if not e2_name: - messagebox.showinfo("出错了", '性别不能为空!') - return - e3_name = self.e3.get() - e4_name = self.e4.get() - e5_name = self.e5.get() - e6_name = self.e6.get() - e7_name = self.e7.get() - self.main_window.edit_value(e1_number, e2_name, e3_name, e4_name, e5_name, e6_name, e7_name) - self.top.destroy() - - - def add_click(self, event): - e1_name = self.e1.get() - if not e1_name: - messagebox.showinfo("出错了", '工号不能为空!') - return - e2_name = self.e2.get() - if not e2_name: - messagebox.showinfo("出错了", '姓名不能为空!') - return - e3_name = self.e3.get() - e4_name = self.e4.get() - e5_name = self.e5.get() - e6_name = self.e6.get() - e7_name = self.e7.get() - self.main_window.add_value(e1_name, e2_name, e3_name, e4_name, e5_name, e6_name, e7_name) - self.top.destroy() - - - -class MainWindow(object): - - def __init__(self, root): - self.contacts = [] - self.root = root - self.add_btn_widget() - self.add_search_widget() - self.add_listbox_widget() - self.add_statusbar_widget() - self.read_save_contacts() - self.sel_item = 0 - - - def add_btn_widget(self): - frame = Frame(self.root) - frame.pack(pady=8) - self.addBtn = Button(frame, text='添加职员信息', width=10, command=lambda: self.popup("添加职员信息")) - self.addBtn.pack(padx=5, fill=X, side=LEFT) - self.delAllBtn = Button(frame, text='删除所有信息', width=10, command=self.del_all_contacts) - self.delAllBtn.pack(padx=5, fill=X, side=LEFT) - self.saveAllBtn = Button(frame, text='保存所有信息', width=10, command=self.save_all_contacts) - self.saveAllBtn.pack(padx=5, fill=X, side=LEFT) - - - def add_search_widget(self): - frame = Frame(self.root) - frame.pack(pady=8) - entry1 = self.input_view = Entry(frame, width=34) - entry1.insert(0, '输入部分姓名按回车查询') - entry1.bind("", self.click_input) - entry1.bind("", self.focusout_input) - entry1.bind('', self.search_contact) - entry1.bind('', self.cancel_search) - entry1.pack(ipady=3, padx=5, side=LEFT) - entry1.selection_range(0, len(entry1.get())) - entry1.focus() - command4 = self.search_btn = Button(frame, text='清空输入', width=15, command=lambda: self.cancel_search(None)) - command4["state"] = "disabled" - assert isinstance(LEFT, object) - command4.pack(padx=5, side=LEFT) - - - def click_input(self, event): - if self.input_view.get() == '输入部分工号或姓名按回车查询': - self.input_view.delete(0, END) - - - def focusout_input(self, event): - if len(self.input_view.get()) == 0: - self.input_view.insert(0, '输入部分工号或姓名按回车查询') - - - def add_listbox_widget(self): - frame = Frame(self.root) - frame.pack(pady=8) - bolded = font.Font(size=20) - self.lb = Listbox(frame, font=bolded, height=14, width=25, borderwidth=0) - scrollbar = Scrollbar(frame, orient=VERTICAL) - scrollbar.config(command=self.lb.yview) - scrollbar.pack(side=RIGHT, fill=Y) - self.lb.config(yscrollcommand=scrollbar.set, activestyle='none') - scrollbar2 = Scrollbar(frame, orient=HORIZONTAL) - scrollbar2.config(command=self.lb.xview) - scrollbar2.pack(side=BOTTOM, fill=X) - self.lb.config(xscrollcommand=scrollbar2.set, activestyle='none') - self.lb.pack(fill=BOTH) - self.lb.bind('', self.dbclick) - self.lb.bind('', self.rclick_popup) - - - def add_statusbar_widget(self): - frame = Frame(self.root) - frame.pack(pady=8, side=LEFT) - self.label = Label(frame, text='>系统现有 0 位职员<') - self.label.pack() - - - def rclick_popup(self, event): - a_menu = Menu(self.root, tearoff=0) - a_menu.add_command(label='编辑选中的职员信息', command=self.edit_contact) - a_menu.add_command(label='删除选中的职员信息', command=self.del_contact) - a_menu.post(event.x_root, event.y_root) - - - def edit_contact(self): - selection = self.lb.curselection() - if len(selection) == 0: - messagebox.showerror("出错了", '请先左键选中待操作的职员信息!') - return - self.sel_item = selection[0] - self.right_clidk_reset() - contact = self.contacts[self.sel_item] - self.popup("编辑职员信息", contact=contact) - - - def del_contact(self): - selection = self.lb.curselection() - if len(selection) == 0: - messagebox.showerror("出错了", '请先左键选中待操作的职员信息!') - return - self.right_clidk_reset() - answer = messagebox.askyesno("提示", "您确定要删除此职员信息吗?") - if answer: - self.lb.delete(self.sel_item, self.sel_item) - self.contacts.pop(self.sel_item) - self.label.config(text='系统现有 %d 位职员' % len(self.contacts)) - messagebox.showinfo('提示', '职员信息从列表删除成功!\n若需要保存操作结果,请点击“保存所有职员信息”') - - - def right_clidk_reset(self, is_dbclick=False): - b_text = self.search_btn["state"] - if b_text == "normal": - ic = -1 - item = self.lb.selection_get() - if not is_dbclick: - self.cancel_search(None) - for ct in self.contacts: - ic += 1 - if (ct.name in item) and (ct.phone_number in item): - break - self.sel_item = ic - self.lb.selection_set(ic, ic) - - - def dbclick(self, event): - selection = self.lb.curselection() - self.sel_item = selection[0] - self.right_clidk_reset(is_dbclick=True) - contact = self.contacts[self.sel_item] - wp = contact.sex if len(contact.sex) != 0 else '空' - em = contact.birth if len(contact.birth) != 0 else '空' - ab = contact.entry_time if len(contact.entry_time) != 0 else '空' - lh = contact.position if len(contact.position) != 0 else '空' - mn = contact.salary if len(contact.salary) != 0 else '空' - msg = '工号:%s\n姓名:%s\n性别:%s\n出生日期:%s\n入职时间:%s\n职位:%s\n工资:%s\n' % ( - contact.number, contact.name, wp, em, ab, lh, mn) - messagebox.showinfo("详细信息", msg) - - - def popup(self, title, contact=None): - self.cancel_search(None) - self.w = PopupWindow(self.root, self, title, contact) - self.addBtn["state"] = "disabled" - self.root.wait_window(self.w.top) - self.addBtn["state"] = "normal" - - - def del_all_contacts(self): - self.cancel_search(None) - answer = messagebox.askyesno("提示", "您确定要删除所有信息吗?") - if answer: - self.contacts.clear() - self.lb.delete(0, END) - remove("contacts.csv") - self.label.config(text='系统现有 %d 位职员' % len(self.contacts)) - - - def save_all_contacts(self): - self.cancel_search(None) - f = open("contacts.csv", "w", encoding='utf-8') - for contact in self.contacts: - str = '{},{},{},{}\n'.format(contact.number, contact.name, contact.sex, contact.birth, contact.entry_time, - contact.position, contact.salary) - f.write(str) - f.close() - messagebox.showinfo('提示', '保存 %d 位职员信息到文件成功!' % len(self.contacts)) - - - def read_save_contacts(self): - if not path.exists('contacts.csv'): - return - f = open("contacts.csv", "r", encoding='utf-8') - for line in f: - array = line.strip().split(',') - contact = Contact(array[0], array[1], array[2], array[3], array[4], array[5], array[6]) - self.contacts.append(contact) - self.lb.insert(END, '工号:%s 姓名:%s性别:%s出生日期:%s入职时间:%s职位:%s工资:%s' % ( - contact.number, contact.name, contact.sex, contact.birth, contact.entry_time, contact.position, - contact.salary)) - self.label.config(text='系统现有 %d 位职员' % len(self.contacts)) - f.close() - - - def add_value(self, number, name, sex, birth, entry_time, position, salary): - contact = Contact(number, name, sex, birth, entry_time, position, salary) - self.contacts.append(contact) - self.lb.insert(END, '工号:%s 姓名:%s性别:%s出生日期:%s入职时间:%s职位:%s工资:%s' % ( - contact.number, contact.name, contact.sex, contact.birth, contact.entry_time, contact.position, contact.salary)) - self.label.config(text='系统现有 %d 位职员' % len(self.contacts)) - - - def edit_value(self, number, name, sex, birth, entry_time, position, salary): - contact = self.contacts[self.sel_item] - contact.number = number - contact.name = name - contact.sex = sex - contact.birth = birth - contact.entry_time = entry_time - contact.position = position - contact.salary = salary - self.lb.delete(0, END) - for contact in self.contacts: - self.lb.insert(END, '工号:%s 姓名:%s性别:%s出生日期:%s入职时间:%s职位:%s工资:%s' % ( - contact.number, contact.name, contact.sex, contact.birth, contact.entry_time, contact.position, - contact.salary)) - self.label.config(text='系统现有 %d 位职员' % len(self.contacts)) - - - def search_contact(self, event): - self.search_btn["state"] = "normal" - self.lb.delete(0, END) - key = self.input_view.get().strip() - ci = 0 - for contact in self.contacts: - if (key in contact.number) or (key in contact.name): - self.lb.insert(END, '工号:%s 姓名:%s性别:%s出生日期:%s入职时间:%s职位:%s工资:%s' % ( - contact.number, contact.name, contact.sex, contact.birth, contact.entry_time, contact.position, - contact.salary)) - ci += 1 - self.label.config(text='查询到 %d 位职员' % ci) - - # 取消搜索 - def cancel_search(self, event): - b_state = self.search_btn["state"] - if b_state == "normal": - self.search_btn["state"] = "disabled" - self.lb.delete(0, END) - self.input_view.delete(0, END) - self.input_view.insert(0, '输入部分工号或姓名按回车查询') - for contact in self.contacts: - self.lb.insert(END, '工号:%s 姓名:%s性别:%s出生日期:%s入职时间:%s职位:%s工资:%s' % ( - contact.number, contact.name, contact.sex, contact.birth, contact.entry_time, contact.position, - contact.salary)) - self.label.config(text='系统现有 %d 位职员' % len(self.contacts)) - self.input_view.selection_range(0, len(self.input_view.get())) - - -# 职员类对象 -class Contact: - def __init__(self, number: object, name: object, sex: object, birth: object, entry_time: object, position: object, - salary: object) -> object: - """ - :rtype: object - """ - self.number = number - self.name = name - self.sex = sex - self.birth = birth - self.entry_time = entry_time - self.position = position - self.salary = salary - - - -if __name__ == "__main__": - root = Tk() - root.wm_resizable(False, False) - root.title('职工管理系统') - w = 380 - h = 560 - ws = root.winfo_screenwidth() - hs = root.winfo_screenheight() - root.geometry('%dx%d+%d+%d' % (w, h, (ws - w) / 2, (hs - h) / 2)) - m = MainWindow(root) - root.mainloop() -# Press the green button in the gutter to run the script. -if __name__ == '__main__': - print_hi('PyCharm') - -# See PyCharm help at https://www.jetbrains.com/help/pycharm/ diff --git a/.idea/misc.xml b/.idea/misc.xml index a44514f..85b24ef 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,7 @@ - - + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index fdd8fdf..b65824e 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/.idea/pythonProject1.iml b/.idea/pythonProject职工.iml similarity index 75% rename from .idea/pythonProject1.iml rename to .idea/pythonProject职工.iml index f8d0768..2c80e12 100644 --- a/.idea/pythonProject1.iml +++ b/.idea/pythonProject职工.iml @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/main.py b/main.py index cdc5aef..2ce1115 100644 --- a/main.py +++ b/main.py @@ -2,392 +2,235 @@ # Press Shift+F10 to execute it or replace it with your code. # Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. -from tkinter import * -from tkinter import font -from tkinter import messagebox -from os import path -from os import remove - - - -class PopupWindow(object): - # 初始化构造及添加组件到弹出框 - def __init__(self, master, main_window, title, contact=None): - self.main_window = main_window - top = self.top = Toplevel(master) - top.title(title) - top.resizable(False, False) - w = 280 - h = 500 - top.geometry('%dx%d+%d+%d' % (w, h, (ws - w) / 2, (hs - h) / 2)) - top.bind('', lambda event: top.destroy()) - - m_font = font.Font(size=16) - l = Label(top, text="编号:", font=m_font) - l.pack(side=TOP, pady=5) - self.e1 = Entry(top) - self.e1.pack(side=TOP, padx=16, ipady=3, fill=X) - self.e1.focus() - if contact is not None: - self.e1.insert(0, contact.number) - - l2 = Label(top, text="姓名:", font=m_font) - l2.pack(side=TOP, pady=5) - self.e2 = Entry(top) - self.e2.pack(side=TOP, padx=16, ipady=3, fill=X) - if contact is not None: - self.e2.insert(0, contact.name) - - l2 = Label(top, text="性别:", font=m_font) - l2.pack(side=TOP, pady=5) - self.e3 = Entry(top) - self.e3.pack(side=TOP, padx=16, ipady=3, fill=X) - if contact is not None: - self.e3.insert(0, contact.sex) - - l2 = Label(top, text="出生日期:", font=m_font) - l2.pack(side=TOP, pady=5) - self.e4 = Entry(top) - self.e4.pack(side=TOP, padx=16, ipady=3, fill=X) - if contact is not None: - self.e4.insert(0, contact.birth) - - l2 = Label(top, text="入职时间:", font=m_font) - l2.pack(side=TOP, pady=5) - self.e5 = Entry(top) - self.e5.pack(side=TOP, padx=16, ipady=3, fill=X) - if contact is not None: - self.e5.insert(0, contact.entry_time) - - l2 = Label(top, text="职位:", font=m_font) - l2.pack(side=TOP, pady=5) - self.e6 = Entry(top) - self.e6.pack(side=TOP, padx=16, ipady=3, fill=X) - if contact is not None: - self.e6.insert(0, contact.position) - - l2 = Label(top, text="工资:", font=m_font) - l2.pack(side=TOP, pady=5) - self.e7 = Entry(top) - self.e7.pack(side=TOP, padx=16, ipady=3, fill=X) - if contact is not None: - self.e7.insert(0, contact.salary) - - if contact is None: - b2 = Button(top, text='添加', width=12, command=lambda: self.add_click(None)) - self.e7.bind('', self.add_click) + + +def print_hi(name): + # Use a breakpoint in the code line below to debug your script. + from tkinter import messagebox + import tkinter as tk + + info_list = [] + window = tk.Tk() + window.title('员工管理系统') + window.geometry('300x300') + + staff_title = tk.Label(window, text='欢迎来到员工管理系统', bg='yellow', font=6) + staff_title.pack() + + def add_staff_info(): # 添加 + + def add_ok_info(): # 添加完成按钮 + + new_info_dict = dict() + + nn = new_name.get() + ns = new_sex.get() + na = new_age.get() + nb = new_branch.get() + np = new_phone.get() + + new_info_dict['姓名'] = nn + new_info_dict['性别'] = ns + new_info_dict['年龄'] = na + new_info_dict['部门'] = nb + new_info_dict['手机号码'] = np + + info_list.append(new_info_dict) + add_window.destroy() + tk.messagebox.showinfo(title='提示', message='添加成功!') + + new_name = tk.StringVar() + new_sex = tk.StringVar() + new_age = tk.StringVar() + new_branch = tk.StringVar() + new_phone = tk.StringVar() + + add_window = tk.Toplevel(window) + add_window.title('添加信息') + add_window.geometry('300x300') + + tk.Label(add_window, text='姓 名:').place(x=10, y=10) + entry_new_name = tk.Entry(add_window, textvariable=new_name) + entry_new_name.place(x=80, y=10) + + tk.Label(add_window, text='性 别:').place(x=10, y=40) + entry_new_name = tk.Entry(add_window, textvariable=new_sex) + entry_new_name.place(x=80, y=40) + + tk.Label(add_window, text='年 龄:').place(x=10, y=70) + entry_new_name = tk.Entry(add_window, textvariable=new_age) + entry_new_name.place(x=80, y=70) + + tk.Label(add_window, text='部 门:').place(x=10, y=100) + entry_new_name = tk.Entry(add_window, textvariable=new_branch) + entry_new_name.place(x=80, y=100) + + tk.Label(add_window, text='手机号码:').place(x=10, y=130) + entry_new_name = tk.Entry(add_window, textvariable=new_phone) + entry_new_name.place(x=80, y=130) + + add_ok_button = tk.Button(add_window, text='完成', command=add_ok_info) + add_ok_button.place(x=100, y=200) + + def show_staff_info(): # 显示 + i = 20 + show_window = tk.Toplevel(window) + show_window.title('显示员工列表') + show_window.geometry('320x300') + + tk.Label(show_window, text='姓 名 性 别 年 龄 部 门 手 机 号 码', + bg='yellow').pack() + for temp_info in info_list: + tk.Label(show_window, text=temp_info['姓名']).place(x=0, y=i) + tk.Label(show_window, text=temp_info['性别']).place(x=70, y=i) + tk.Label(show_window, text=temp_info['年龄']).place(x=130, y=i) + tk.Label(show_window, text=temp_info['部门']).place(x=190, y=i) + tk.Label(show_window, text=temp_info['手机号码']).place(x=260, y=i) + i += 30 + + def del_staff_info(): # 删除 + + def del_ok_info(): # 确认删除按钮 + + dn = del_name.get() + for i in info_list: + if dn in i['姓名']: + del info_list[info_list.index(i)] + del_window.destroy() + tk.messagebox.showinfo(title='提示', message='删除成功!') + + del_name = tk.StringVar() + + del_window = tk.Toplevel(window) + del_window.title('删除信息') + del_window.geometry('350x200') + + tk.Label(del_window, text='请输入要删除的员工姓名:').place(x=10, y=10) + entry_del_name = tk.Entry(del_window, textvariable=del_name) + entry_del_name.place(x=160, y=10) + + del_ok_button = tk.Button(del_window, text='确认删除', command=del_ok_info) + del_ok_button.place(x=150, y=150) + + def modify_staff_info(): # 修改 + + def modify_ok_info(): # 确认修改按钮 + flag = 0 + on = old_name.get() + for i in info_list: + if on in i['姓名']: + flag = 1 + info_list[info_list.index(i)]['姓名'] = new_name.get() + info_list[info_list.index(i)]['性别'] = new_sex.get() + info_list[info_list.index(i)]['年龄'] = new_age.get() + info_list[info_list.index(i)]['部门'] = new_branch.get() + info_list[info_list.index(i)]['手机号码'] = new_phone.get() + modify_window.destroy() + tk.messagebox.showinfo(title='提示', message='修改成功!') + + if flag == 0: + tk.messagebox.showerror(title='警告', message='查无此人!') + + if len(info_list) == 0: + tk.messagebox.showwarning(title='警告', message='员工列表为空!') + else: + old_name = tk.StringVar() + + new_name = tk.StringVar() + new_sex = tk.StringVar() + new_age = tk.StringVar() + new_branch = tk.StringVar() + new_phone = tk.StringVar() + + modify_window = tk.Toplevel(window) + modify_window.title('修改信息') + modify_window.geometry('350x300') + + tk.Label(modify_window, text='请输入要修改的员工姓名:').place(x=10, y=10) + entry_old_name = tk.Entry(modify_window, textvariable=old_name) + entry_old_name.place(x=160, y=10) + + tk.Label(modify_window, text='--------------------请输入要修改后员工信息--------------------').place(x=0, + y=50) + + tk.Label(modify_window, text='姓 名:').place(x=10, y=80) + entry_new_name = tk.Entry(modify_window, textvariable=new_name) + entry_new_name.place(x=60, y=80) + + tk.Label(modify_window, text='性 别:').place(x=10, y=110) + entry_new_name = tk.Entry(modify_window, textvariable=new_sex) + entry_new_name.place(x=60, y=110) + + tk.Label(modify_window, text='年 龄:').place(x=10, y=140) + entry_new_name = tk.Entry(modify_window, textvariable=new_age) + entry_new_name.place(x=60, y=140) + + tk.Label(modify_window, text='部 门:').place(x=10, y=170) + entry_new_name = tk.Entry(modify_window, textvariable=new_branch) + entry_new_name.place(x=60, y=170) + + tk.Label(modify_window, text='部 门:').place(x=10, y=200) + entry_new_name = tk.Entry(modify_window, textvariable=new_phone) + entry_new_name.place(x=60, y=200) + + modify_ok_button = tk.Button(modify_window, text='确认修改', command=modify_ok_info) + modify_ok_button.place(x=140, y=250) + + def lookup_staff_info(): # 查看 + + def lookup_ok_info(): # 查找按钮 + flag = 0 + ln = lookup_name.get() + for i in info_list: + if ln in i['姓名']: + flag = 1 + staff_info = tk.Toplevel(lookup_window) + staff_info.title('员工信息') + staff_info.geometry('300x300') + tk.Label(staff_info, text='姓 名:%s' % i['姓名']).place(x=10, y=10) + tk.Label(staff_info, text='性 别:%s' % i['性别']).place(x=10, y=40) + tk.Label(staff_info, text='年 龄:%s' % i['年龄']).place(x=10, y=70) + tk.Label(staff_info, text='部 门:%s' % i['部门']).place(x=10, y=100) + tk.Label(staff_info, text='手机号码:%s' % i['手机号码']).place(x=10, y=130) + tk.Button(staff_info, text='关 闭', command=lookup_window.destroy).place(x=200, y=200) + tk.Button(staff_info, text='继续查找', command=staff_info.destroy).place(x=50, y=200) + + if flag == 0: + tk.messagebox.showerror(title='提示', message='查无此人!') + + if len(info_list) == 0: + tk.messagebox.showwarning(title='警告', message='员工列表为空!') else: - b2 = Button(top, text='编辑', width=12, command=lambda: self.edit_click(None)) - self.e7.bind('', self.edit_click) - b2.pack(side=LEFT, pady=10, padx=20) - b3 = Button(top, text='取消', width=12, command=lambda: top.destroy()) - b3.pack(side=RIGHT, pady=10, padx=20) - - top.grab_set() - - # 点击编辑职员信息按钮 - def edit_click(self, event): - e1_number = self.e2.get() - if not e1_number: - messagebox.showinfo("出错了", '名字不能为空!') - return - e2_name = self.e3.get() - if not e2_name: - messagebox.showinfo("出错了", '性别不能为空!') - return - e3_name = self.e3.get() - e4_name = self.e4.get() - e5_name = self.e5.get() - e6_name = self.e6.get() - e7_name = self.e7.get() - self.main_window.edit_value(e1_number, e2_name, e3_name, e4_name, e5_name, e6_name, e7_name) - self.top.destroy() - - # 点击添加职员信息按钮 - def add_click(self, event): - e1_name = self.e1.get() - if not e1_name: - messagebox.showinfo("出错了", '编号不能为空!') - return - e2_name = self.e2.get() - if not e2_name: - messagebox.showinfo("出错了", '姓名不能为空!') - return - e3_name = self.e3.get() - e4_name = self.e4.get() - e5_name = self.e5.get() - e6_name = self.e6.get() - e7_name = self.e7.get() - self.main_window.add_value(e1_name, e2_name, e3_name, e4_name, e5_name, e6_name, e7_name) - self.top.destroy() - - -# 主界面类 -class MainWindow(object): - # 默认初始化构造 - def __init__(self, root): - self.contacts = [] - self.root = root - self.add_btn_widget() - self.add_search_widget() - self.add_listbox_widget() - self.add_statusbar_widget() - self.read_save_contacts() - self.sel_item = 0 - - # 添加操作按钮 - def add_btn_widget(self): - frame = Frame(self.root) - frame.pack(pady=8) - self.addBtn = Button(frame, text='添加职员信息', width=10, command=lambda: self.popup("添加职员信息")) - self.addBtn.pack(padx=5, fill=X, side=LEFT) - self.delAllBtn = Button(frame, text='删除所有信息', width=10, command=self.del_all_contacts) - self.delAllBtn.pack(padx=5, fill=X, side=LEFT) - self.saveAllBtn = Button(frame, text='保存所有信息', width=10, command=self.save_all_contacts) - self.saveAllBtn.pack(padx=5, fill=X, side=LEFT) - - # 添加搜索框 - def add_search_widget(self): - frame = Frame(self.root) - frame.pack(pady=8) - entry1 = self.input_view = Entry(frame, width=34) - entry1.insert(0, '输入部分姓名按回车查询') - entry1.bind("", self.click_input) - entry1.bind("", self.focusout_input) - entry1.bind('', self.search_contact) - entry1.bind('', self.cancel_search) - entry1.pack(ipady=3, padx=5, side=LEFT) - entry1.selection_range(0, len(entry1.get())) - entry1.focus() - command4 = self.search_btn = Button(frame, text='清空输入', width=15, command=lambda: self.cancel_search(None)) - command4["state"] = "disabled" - assert isinstance(LEFT, object) - command4.pack(padx=5, side=LEFT) - - # 点击输入框清空内容 - def click_input(self, event): - if self.input_view.get() == '输入部分编号或姓名按回车查询': - self.input_view.delete(0, END) - - # 输入框失去焦点时 - def focusout_input(self, event): - if len(self.input_view.get()) == 0: - self.input_view.insert(0, '输入部分编号或姓名按回车查询') - - # 添加列表及滚动条 - def add_listbox_widget(self): - frame = Frame(self.root) - frame.pack(pady=8) - bolded = font.Font(size=20) - self.lb = Listbox(frame, font=bolded, height=14, width=25, borderwidth=0) - scrollbar = Scrollbar(frame, orient=VERTICAL) - scrollbar.config(command=self.lb.yview) - scrollbar.pack(side=RIGHT, fill=Y) - self.lb.config(yscrollcommand=scrollbar.set, activestyle='none') - scrollbar2 = Scrollbar(frame, orient=HORIZONTAL) - scrollbar2.config(command=self.lb.xview) - scrollbar2.pack(side=BOTTOM, fill=X) - self.lb.config(xscrollcommand=scrollbar2.set, activestyle='none') - self.lb.pack(fill=BOTH) - self.lb.bind('', self.dbclick) - self.lb.bind('', self.rclick_popup) - - # 添加界面底部职员人数 - def add_statusbar_widget(self): - frame = Frame(self.root) - frame.pack(pady=8, side=LEFT) - self.label = Label(frame, text='>系统现有 0 位职员<') - self.label.pack() - - # 右键菜单 - def rclick_popup(self, event): - a_menu = Menu(self.root, tearoff=0) - a_menu.add_command(label='编辑选中的职员信息', command=self.edit_contact) - a_menu.add_command(label='删除选中的职员信息', command=self.del_contact) - a_menu.post(event.x_root, event.y_root) - - # 右键编辑选中的职员信息 - def edit_contact(self): - selection = self.lb.curselection() - if len(selection) == 0: - messagebox.showerror("出错了", '请先左键选中待操作的职员信息!') - return - self.sel_item = selection[0] - self.right_clidk_reset() - contact = self.contacts[self.sel_item] - self.popup("编辑职员信息", contact=contact) - - # 右键删除选中的职员信息 - def del_contact(self): - selection = self.lb.curselection() - if len(selection) == 0: - messagebox.showerror("出错了", '请先左键选中待操作的职员信息!') - return - self.right_clidk_reset() - answer = messagebox.askyesno("提示", "您确定要删除此职员信息吗?") - if answer: - self.lb.delete(self.sel_item, self.sel_item) - self.contacts.pop(self.sel_item) - self.label.config(text='系统现有 %d 位职员' % len(self.contacts)) - messagebox.showinfo('提示', '职员信息从列表删除成功!\n若需要保存操作结果,请点击“保存所有职员信息”') - - # 若是搜索后右键,则操作重置列表 - def right_clidk_reset(self, is_dbclick=False): - b_text = self.search_btn["state"] - if b_text == "normal": - ic = -1 - item = self.lb.selection_get() - if not is_dbclick: - self.cancel_search(None) - for ct in self.contacts: - ic += 1 - if (ct.name in item) and (ct.phone_number in item): - break - self.sel_item = ic - self.lb.selection_set(ic, ic) - - # 双击职员信息条目查看详细信息 - def dbclick(self, event): - selection = self.lb.curselection() - self.sel_item = selection[0] - self.right_clidk_reset(is_dbclick=True) - contact = self.contacts[self.sel_item] - wp = contact.sex if len(contact.sex) != 0 else '空' - em = contact.birth if len(contact.birth) != 0 else '空' - ab = contact.entry_time if len(contact.entry_time) != 0 else '空' - lh = contact.position if len(contact.position) != 0 else '空' - mn = contact.salary if len(contact.salary) != 0 else '空' - msg = '编号:%s\n姓名:%s\n性别:%s\n出生日期:%s\n入职时间:%s\n职位:%s\n工资:%s\n' % ( - contact.number, contact.name, wp, em, ab, lh, mn) - messagebox.showinfo("详细信息", msg) - - # 添加、编辑员工信息弹窗 - def popup(self, title, contact=None): - self.cancel_search(None) - self.w = PopupWindow(self.root, self, title, contact) - self.addBtn["state"] = "disabled" - self.root.wait_window(self.w.top) - self.addBtn["state"] = "normal" - - # 删除所有员工信息 - def del_all_contacts(self): - self.cancel_search(None) - answer = messagebox.askyesno("提示", "您确定要删除所有信息吗?") - if answer: - self.contacts.clear() - self.lb.delete(0, END) - remove("contacts.csv") - self.label.config(text='系统现有 %d 位职员' % len(self.contacts)) - - # 保存职员信息到文件 - def save_all_contacts(self): - self.cancel_search(None) - f = open("contacts.csv", "w", encoding='utf-8') - for contact in self.contacts: - str = '{},{},{},{}\n'.format(contact.number, contact.name, contact.sex, contact.birth, contact.entry_time, - contact.position, contact.salary) - f.write(str) - f.close() - messagebox.showinfo('提示', '保存 %d 位职员信息到文件成功!' % len(self.contacts)) - - # 读取保存在文件的职员信息 - def read_save_contacts(self): - if not path.exists('contacts.csv'): - return - f = open("contacts.csv", "r", encoding='utf-8') - for line in f: - array = line.strip().split(',') - contact = Contact(array[0], array[1], array[2], array[3], array[4], array[5], array[6]) - self.contacts.append(contact) - self.lb.insert(END, '编号:%s 姓名:%s性别:%s出生日期:%s入职时间:%s职位:%s工资:%s' % ( - contact.number, contact.name, contact.sex, contact.birth, contact.entry_time, contact.position, - contact.salary)) - self.label.config(text='系统现有 %d 位职员' % len(self.contacts)) - f.close() - - # 添加职员信息回调 - def add_value(self, number, name, sex, birth, entry_time, position, salary): - contact = Contact(number, name, sex, birth, entry_time, position, salary) - self.contacts.append(contact) - self.lb.insert(END, '编号:%s 姓名:%s性别:%s出生日期:%s入职时间:%s职位:%s工资:%s' % ( - contact.number, contact.name, contact.sex, contact.birth, contact.entry_time, contact.position, contact.salary)) - self.label.config(text='系统现有 %d 位职员' % len(self.contacts)) - - # 编辑职员信息回调 - def edit_value(self, number, name, sex, birth, entry_time, position, salary): - contact = self.contacts[self.sel_item] - contact.number = number - contact.name = name - contact.sex = sex - contact.birth = birth - contact.entry_time = entry_time - contact.position = position - contact.salary = salary - self.lb.delete(0, END) - for contact in self.contacts: - self.lb.insert(END, '编号:%s 姓名:%s性别:%s出生日期:%s入职时间:%s职位:%s工资:%s' % ( - contact.number, contact.name, contact.sex, contact.birth, contact.entry_time, contact.position, - contact.salary)) - self.label.config(text='系统现有 %d 位职员' % len(self.contacts)) - - # 搜索职员信息方法 - def search_contact(self, event): - self.search_btn["state"] = "normal" - self.lb.delete(0, END) - key = self.input_view.get().strip() - ci = 0 - for contact in self.contacts: - if (key in contact.number) or (key in contact.name): - self.lb.insert(END, '编号:%s 姓名:%s性别:%s出生日期:%s入职时间:%s职位:%s工资:%s' % ( - contact.number, contact.name, contact.sex, contact.birth, contact.entry_time, contact.position, - contact.salary)) - ci += 1 - self.label.config(text='查询到 %d 位职员' % ci) - - # 取消搜索 - def cancel_search(self, event): - b_state = self.search_btn["state"] - if b_state == "normal": - self.search_btn["state"] = "disabled" - self.lb.delete(0, END) - self.input_view.delete(0, END) - self.input_view.insert(0, '输入部分编号或姓名按回车查询') - for contact in self.contacts: - self.lb.insert(END, '编号:%s 姓名:%s性别:%s出生日期:%s入职时间:%s职位:%s工资:%s' % ( - contact.number, contact.name, contact.sex, contact.birth, contact.entry_time, contact.position, - contact.salary)) - self.label.config(text='系统现有 %d 位职员' % len(self.contacts)) - self.input_view.selection_range(0, len(self.input_view.get())) - - -# 职员类对象 -class Contact: - def __init__(self, number: object, name: object, sex: object, birth: object, entry_time: object, position: object, - salary: object) -> object: - """ - :rtype: object - """ - self.number = number - self.name = name - self.sex = sex - self.birth = birth - self.entry_time = entry_time - self.position = position - self.salary = salary - - -# 程序启动入口 -if __name__ == "__main__": - root = Tk() - root.wm_resizable(False, False) - root.title('人事管理系统') - w = 380 - h = 560 - ws = root.winfo_screenwidth() - hs = root.winfo_screenheight() - root.geometry('%dx%d+%d+%d' % (w, h, (ws - w) / 2, (hs - h) / 2)) - m = MainWindow(root) - root.mainloop() + lookup_name = tk.StringVar() + lookup_name.set('NONE') + + lookup_window = tk.Toplevel(window) + lookup_window.title('查看信息') + lookup_window.geometry('300x200') + + tk.Label(lookup_window, text='员工姓名:').place(x=10, y=10) + entry_old_name = tk.Entry(lookup_window, textvariable=lookup_name) + entry_old_name.place(x=80, y=10) + + modify_ok_button = tk.Button(lookup_window, text='查 找', command=lookup_ok_info) + modify_ok_button.place(x=130, y=150) + + add_button = tk.Button(window, text='1.添加员工信息', command=add_staff_info) + add_button.pack() + del_button = tk.Button(window, text='2.删除员工信息', command=del_staff_info) + del_button.pack() + modify_button = tk.Button(window, text='3.修改员工信息', command=modify_staff_info) + modify_button.pack() + lookup_button = tk.Button(window, text='4.查找员工信息', command=lookup_staff_info) + lookup_button.pack() + show_button = tk.Button(window, text='5.显示员工信息', command=show_staff_info) + show_button.pack() + show_button = tk.Button(window, text='0.退 出 系 统', command=window.destroy) + show_button.pack() + + window.mainloop() + + # Press the green button in the gutter to run the script. if __name__ == '__main__': print_hi('PyCharm')