diff --git a/.idea/.idea/.gitignore b/.idea/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.idea/.gitignore @@ -0,0 +1,8 @@ +# 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 new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea/misc.xml b/.idea/.idea/misc.xml new file mode 100644 index 0000000..2259309 --- /dev/null +++ b/.idea/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/.idea/modules.xml b/.idea/.idea/modules.xml new file mode 100644 index 0000000..fdd8fdf --- /dev/null +++ b/.idea/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea/pythonProject1.iml b/.idea/.idea/pythonProject1.iml new file mode 100644 index 0000000..f263dd1 --- /dev/null +++ b/.idea/.idea/pythonProject1.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/main.py b/.idea/main.py new file mode 100644 index 0000000..107b767 --- /dev/null +++ b/.idea/main.py @@ -0,0 +1,395 @@ +# 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/