from tkinter import * from tkinter import ttk import mysql_internes from tkinter import messagebox # 实现录入页面的类 class InsertFrame(Frame): def __init__(self, root): super().__init__(root) self.id = StringVar() self.name = StringVar() self.department = StringVar() self.sex = StringVar() self.wages = StringVar() self.hiredata = StringVar() # 打印录入是否成功信息 self.status_insert = StringVar() self.insert_page() # 打印修输入的项目以及输入框 def insert_page(self): Label(self, text='工 号 : ').grid(row=1, column=1, pady=5) self.entry_id = Entry(self, textvariable=self.id) self.entry_id.grid(row=1, column=2, pady=5) Label(self, text = '姓 名 : ').grid(row=2, column = 1, pady=5) self.entry_name = Entry(self, textvariable=self.name) self.entry_name.grid(row = 2, column = 2, pady = 5) Label(self, text='部 门 : ').grid(row=3, column=1, pady=5) self.entry_department = Entry(self, textvariable=self.department) self.entry_department.grid(row=3, column=2, pady=5) Label(self, text='性 别 : ').grid(row=4, column=1, pady=5) self.entry_sex = Entry(self, textvariable=self.sex) self.entry_sex.grid(row=4, column=2, pady=5) Label(self, text='薪 资 : ').grid(row=5, column=1, pady=5) self.entry_wages = Entry(self, textvariable=self.wages) self.entry_wages.grid(row=5, column=2, pady=5) Label(self, text='入职时间 : ').grid(row=6, column=1, pady=5) self.entry_hiredata = Entry(self, textvariable=self.hiredata) self.entry_hiredata.grid(row=6, column=2, pady=5) Button(self, text = '清空', command = self.insert_deleteValue).grid(row=7, column=1, pady=10) Button(self, text = '录入', command = self.insert_data).grid(row = 7, column = 3, pady = 10) Label(self, textvariable=self.status_insert).grid(row=8, column=2, padx=10) # 输出所有实习生信息 def insert_data(self): if not self.id.get(): self.insert_id = int(0) else: self.insert_id = int(self.id.get()) if not self.name.get(): self.insert_name = 'NULL' else: self.insert_name = self.name.get() if not self.department.get(): self.insert_department = 'NULL' else: self.insert_department = self.department.get() if not self.sex.get(): self.insert_sex = 'NULL' else: self.insert_sex = self.sex.get() if not self.wages.get(): self.insert_wages = 'NULL' else: self.insert_wages = self.wages.get() if not self.hiredata.get(): self.insert_hiredata = 'NULL' else: self.insert_hiredata = self.hiredata.get() flag, s = mysql_internes.check_interne_id(self.insert_id) # 查询id self.status_insert.set(s) if flag == False: # 若已经存在的情况,不能录入 return ins = (self.insert_id, self.insert_name, self.insert_department, self.insert_sex, self.insert_wages, self.insert_hiredata) mysql_internes.insert(ins) # 这一部分为存在并导入信息 # 删除输入框中的内容 def insert_deleteValue(self): self.entry_id.delete(0, END) self.entry_name.delete(0, END) self.entry_department.delete(0, END) self.entry_sex.delete(0, END) self.entry_wages.delete(0, END) self.entry_hiredata.delete(0, END) # 实现查找功能的类 class SearchFrame(Frame): def __init__(self, root): super().__init__(root) self.table_search_view = Frame() self.show_table_search() # 实现显示查询页面的整个大框架分布 def show_table_search(self): columns = ("id", "name", "department", "sex", "wages", "hiredata") columns_values = ("工号", "姓名", "部门", "性别", "薪资", "入职时间") self.tree_view = ttk.Treeview(self, show = 'headings', columns = columns) for col in columns: self.tree_view.column(col, width = 80, anchor = 'center') for col, colvalue in zip(columns, columns_values): self.tree_view.heading(col, text = colvalue) self.tree_view.pack(fill = BOTH, expand = True) self.show_search_data() self.department_department = StringVar() Entry(self, textvariable=self.department_department).pack(side = LEFT) Button(self, text='按部门查询', command=self.search_department).pack(side=LEFT) # , command = self.treeviewClick Button(self, text = '删 除', command=self.treeviewClick).pack(side = RIGHT) # 下面循环加函数是实现点击标题实现排序 def treeview_sort_column1(tv, col, reverse): # Treeview、列名、排列方式 l = [(tv.set(k, col), k) for k in tv.get_children('')] l.sort(key=lambda t: t[0], reverse=reverse) # 排序方式 for index, (val, k) in enumerate(l): # 根据排序后索引移动 tv.move(k, '', index) tv.heading(col, command=lambda: treeview_sort_column1(tv, col, not reverse)) # 重写标题,使之成为再点倒序的标题 self.tree_color() # 启动程序,根据奇偶行设为不同的背景颜色 def treeview_sort_column2(tv, col, reverse): # Treeview、列名、排列方式 l = [(tv.set(k, col), k) for k in tv.get_children('')] l.sort(reverse=reverse) # 排序方式 for index, (val, k) in enumerate(l): # 根据排序后索引移动 tv.move(k, '', index) tv.heading(col, command=lambda: treeview_sort_column2(tv, col, not reverse)) # 重写标题,使之成为再点倒序的标题 self.tree_color() # 启动程序,根据奇偶行设为不同的背景颜色 for i in range(6): # 给所有标题加(循环上边的“手工”) if i >= 1 and i <=2: self.tree_view.heading(columns[i], text=columns_values[i], command=lambda _col=columns[i]: treeview_sort_column2(self.tree_view, _col, False)) else: self.tree_view.heading(columns[i], text = columns_values[i], command=lambda _col = columns[i]: treeview_sort_column1(self.tree_view, _col, False)) # 定义背景色风格 self.tree_view.tag_configure('even', background='lightblue') # even标签设定为浅蓝色背景颜色 def search_department(self): for _ in map(self.tree_view.delete, self.tree_view.get_children('')): pass if not self.department_department.get(): self.show_search_data() return else: self.department_value = self.department_department.get() internes = mysql_internes.search_department(self.department_value) index = -1 for ins in internes: self.tree_view.insert('', index + 1, values = ( ins['id'], ins['name'], ins['department'], ins['sex'], ins['wages'], ins['hiredata'] )) self.tree_color() # 启动程序,根据奇偶行设为不同的背景颜色 def treeviewClick(self): # 单击 for item in self.tree_view.selection(): item_text = self.tree_view.item(item, "values") mysql_internes.delete_id(item_text[0]) # 删除所选行的第一列的值 self.show_search_data() # 显示数据库中实习生信息表上的信息 def show_search_data(self): for _ in map(self.tree_view.delete, self.tree_view.get_children('')): # 删除原本显示的数据 pass internes = mysql_internes.all() # 获取数据库中的信息并以字典形式返回 index = -1 for ins in internes: self.tree_view.insert('', index + 1, values=( ins['id'], ins['name'], ins['department'], ins['sex'], ins['wages'], ins['hiredata'] )) self.tree_color() # 启动程序,根据奇偶行设为不同的背景颜色 def tree_color(self): # 表格栏隔行显示不同颜色函数 items = self.tree_view.get_children() # 得到根目录所有行的iid i = 0 # 初值 for hiid in items: if i / 2 != int(i / 2): # 判断奇偶 tag1 = '' # 奇数行 else: tag1 = 'even' # 偶数行 self.tree_view.item(hiid, tag=tag1) # 偶数行设为浅蓝色的tag='even' i += 1 # 累加1 # 实现删除页面的类 class DeleteFrame(Frame): def __init__(self, root): super().__init__(root, width = 570, height = 290) self.delete_interne = StringVar() self.status_interne = StringVar() Label(self, text='请输入需要删除实习生的').place(x = 40, y = 60) Label(self, text='姓名或者工号').place(x=64, y=80) Entry(self, textvariable=self.delete_interne).place(x = 30, y = 100) Button(self, text='按工号查询', command=self.id_delete).place(x = 30, y = 130) Button(self, text='按姓名查询', command=self.name_delete).place(x=110, y=130) Label(self, textvariable=self.status_interne).place(x = 45, y = 160) self.id = StringVar() self.name = StringVar() self.department = StringVar() self.sex = StringVar() self.wages = StringVar() self.hiredata = StringVar() Label(self, text = '工 号 :').place(x=300, y=20) Label(self, textvariable=self.id).place(x=360, y=20) Label(self, text='姓 名 :').place(x=300, y=50) Label(self, text = '姓 名 :', textvariable=self.name).place(x=360, y=50) Label(self, text='部 门 :').place(x=300, y=80) Label(self, text = '部 门 :', textvariable=self.department).place(x=360, y=80) Label(self, text='性别 :').place(x=300, y=110) Label(self, textvariable=self.sex).place(x=360, y=110) Label(self, text='薪 资 :').place(x=300, y=140) Label(self, textvariable=self.wages).place(x=360, y=140) Label(self, text='入职时间 :').place(x=300, y=170) Label(self, textvariable=self.hiredata).place(x=360, y=170) self.status_delete = StringVar() Button(self, text='删 除', command=self.delete_ins).place(x=340, y=210) Label(self, textvariable=self.status_delete).place(x=300, y=250) # 通过工号来删除对应实习生的信息 def id_delete(self): if self.delete_interne.get(): self.search_user_id = self.delete_interne.get() flag, ins = mysql_internes.search_id(self.search_user_id) if flag: self.id.set(ins[0][0]),self.name.set(ins[0][1]) self.department.set(ins[0][2]),self.sex.set(ins[0][3]) self.wages.set(ins[0][4]),self.hiredata.set(ins[0][5]) self.status_interne.set('数据查询成功') else: self.status_interne.set(ins) else: self.status_interne.set('请输入需要查询的信息') def name_delete(self): if self.delete_interne.get(): self.search_user_name = self.delete_interne.get() flag, ins = mysql_internes.search_name(self.search_user_name) if flag: self.id.set(ins[0][0]) self.name.set(ins[0][1]) self.department.set(ins[0][2]) self.sex.set(ins[0][3]) self.wages.set(ins[0][4]) self.hiredata.set(ins[0][5]) self.status_interne.set('数据查询成功') else: self.status_interne.set(ins) else: self.status_interne.set('请输入需要查询的信息') def delete_ins(self): flag, str = mysql_internes.delete_id(self.id.get()) if not self.id.get(): str = '需要删除信息不能NULL' self.status_delete.set(str) # 实现修改页面的类 class ChangeFrame(Frame): def __init__(self, root): super().__init__(root, width = 570, height = 290) # Label(self, text = '修改页面').pack() # 查询的修改信息,以及查询、修改成功的提示 self.change_interne = StringVar() self.status_interne = StringVar() self.status_name = StringVar() # 存储实习生信息已经更改的变量 self.id = StringVar() self.name = StringVar() self.department = StringVar() self.sex = StringVar() self.wages = StringVar() self.hiredata = StringVar() # 用于存储修改之前的信息 self.id_change_before = StringVar() self.name_change_before = StringVar() self.department_change_before = StringVar() self.sex_change_before = StringVar() self.wages_change_before = StringVar() self.hiredata_change_before = StringVar() self.insert_page() # 打印修输入的项目以及输入框 def insert_page(self): Label(self, text='请输入需要查询实习生的').place(x=40, y=60) Label(self, text='姓名或者工号').place(x=64, y=80) Entry(self, textvariable=self.change_interne).place(x=30, y=100) Button(self, text='按工号查询', command=self.id_change).place(x=30, y=130) Button(self, text='按姓名查询', command=self.name_change).place(x=110, y=130) Label(self, textvariable=self.status_interne).place(x=45, y=160) Label(self, text='工 号 : ').place(x=240, y=20) Label(self, textvariable=self.id_change_before).place(x=320, y=20) self.entry_id = Entry(self, textvariable=self.id) self.entry_id.place(x=380, y=20) Label(self, text='姓 名 : ').place(x=240, y=50) Label(self, textvariable=self.name_change_before).place(x=315, y=50) self.entry_name = Entry(self, textvariable=self.name) self.entry_name.place(x=380, y=50) Label(self, text='部 门 : ').place(x=240, y=80) Label(self, textvariable=self.department_change_before).place(x=300, y=80) self.entry_department = Entry(self, textvariable=self.department) self.entry_department.place(x=380, y=80) Label(self, text='性 别 : ').place(x=240, y=110) Label(self, textvariable=self.sex_change_before).place(x=318, y=110) self.entry_sex = Entry(self, textvariable=self.sex) self.entry_sex.place(x=380, y=110) Label(self, text='薪 资 : ').place(x=240, y=140) Label(self, textvariable=self.wages_change_before).place(x=318, y=140) self.entry_wages = Entry(self, textvariable=self.wages) self.entry_wages.place(x=380, y=140) Label(self, text='入职时间 : ').place(x=240, y=170) Label(self, textvariable=self.hiredata_change_before).place(x=318, y=170) self.entry_hiredata = Entry(self, textvariable=self.hiredata) self.entry_hiredata.place(x=380, y=170) Button(self, text='修 改', command = self.create_user).place(x=320, y=220) Label(self, textvariable=self.status_name).place(x=305, y=250) # 通过工号或者姓名来查询实习生信息,优先通过工号,若未输入工号,则通过姓名来查询 def id_change(self): if self.change_interne.get(): self.search_user_id = self.change_interne.get() flag, ins = mysql_internes.search_id(self.search_user_id) if flag: self.change_Information(ins) self.status_interne.set('数据查询成功') else: self.status_interne.set(ins) else: self.status_interne.set('请输入需要查询的信息') def name_change(self): if self.change_interne.get(): self.search_user_name = self.change_interne.get() flag, ins = mysql_internes.search_name(self.search_user_name) if flag: self.change_Information(ins) self.status_interne.set('数据查询成功') else: self.status_interne.set(ins) else: self.status_interne.set('请输入需要查询的信息') def change_Information(self, ins): self.id.set(ins[0][0]) self.name.set(ins[0][1]) self.department.set(ins[0][2]) self.sex.set(ins[0][3]) self.wages.set(ins[0][4]) self.hiredata.set(ins[0][5]) self.id_change_before.set(ins[0][0]) self.name_change_before.set(ins[0][1]) self.department_change_before.set(ins[0][2]) self.sex_change_before.set(ins[0][3]) self.wages_change_before.set(ins[0][4]) self.hiredata_change_before.set(ins[0][5]) # 通过获取输入框的信息来修改数据库中实习生的信息 def create_user(self): if not self.id.get(): self.insert_id = int(0) self.status_name.set('请输入修改的工号') return else: self.insert_id = int(self.id.get()) if not self.name.get(): self.insert_name = 'NULL' else: self.insert_name = self.name.get() if not self.department.get(): self.insert_department = 'NULL' else: self.insert_department = self.department.get() if not self.sex.get(): self.insert_sex = 'NULL' else: self.insert_sex = self.sex.get() if not self.wages.get(): self.insert_wages = 'NULL' else: self.insert_wages = self.wages.get() if not self.hiredata.get(): self.insert_hiredata = 'NULL' else: self.insert_hiredata = self.hiredata.get() mysql_internes.delete_id(self.id_change_before.get()) ins = (self.insert_id, self.insert_name, self.insert_department, self.insert_sex, self.insert_wages, self.insert_hiredata) mysql_internes.insert(ins) self.status_name.set('数据修改成功') # 实现帮助页面的类,主要打印一些程序运行的帮助以及规则 class HelpFrame(Frame): def __init__(self, root): super().__init__(root) Label(self, text = '关于录入界面').pack() Label(self, text = '可以录入所有信息为空的信息,但不建议,且工号具有唯一性').pack() Label(self, text = ' ').pack() Label(self, text = '关于查询界面').pack() Label(self, text = '默认为升序排列,可以根据实习生的各类信息进行排列,并能通过快捷键以及鼠标右键实现一定的功能').pack() Label(self, text = '可以查看部门信息以及可以选择信息进行删除').pack() Label(self, text = ' ').pack() Label(self, text = '关于删除界面').pack() Label(self, text = '可以根据工号或者姓名对实习生信息进行删除,工号是唯一的').pack() Label(self, text = ' ').pack() Label(self, text = '关于修改界面').pack() Label(self, text = '可以通过工号或者姓名来查询实习生信息,但查询名字只会出现第一位实习生,按下修改键出现提示即成功').pack()