编写一个简单学生情况录入界面,配合后端数据库,实现数据的增、改、删功能
数据库准备:
import pymysql class Mysql: def __init__(self): self.content = pymysql.Connect( host='127.0.0.1', # mysql的主机ip port=3306, # 端口 user='root', # 用户名 passwd='123456', # 数据库密码 db='test', # 数据库名 charset='utf8', # 字符集 ) self.cursor = self.content.cursor() def query(self): sql = "select id,name,grade from stu;" self.cursor.execute(sql) for row in self.cursor.fetchall(): print("id:%s\t name:%s\t grade:%s" % row) print(f"一共查找到:{self.cursor.rowcount}") def query_stu(self): sql = "select id,name,grade from stu;" self.cursor.execute(sql) stu = [] for row in self.cursor.fetchall(): stu.append(row) #print("id:%s\t name:%s\t grade:%s" % row) return stu def query_grade(self): sql = "select grade from grade;" self.cursor.execute(sql) grades = [] for row in self.cursor.fetchall(): grades.append(row) return grades def insert(self,id,name,grade): sql = """INSERT INTO stu(id,name,grade) VALUES(%s,%s,%s)""" values=(int(id),str(name),int(grade)) try: self.cursor.execute(sql,values) self.content.commit() return "插入成功" except: self.content.rollback return "插入失败" def update(self,id,grade): sql = """update stu set grade=%s where id =%s""" values=(int(grade),int(id)) try: self.cursor.execute(sql,values) self.content.commit() print("更新成功") except: self.content.rollback print("更新失败") def delete(self,id): sql = """delete from stu where id =%s""" #values=(int(id)) try: self.cursor.execute(sql,int(id)) self.content.commit() return "删除成功" except: self.content.rollback return '删除失败' def end(self): self.cursor.close() self.content.close()
界面程序:
import dbmysql as mysql1 import tkinter as tk from tkinter import messagebox from tkinter import ttk def treeview_sort_column(tv, col, reverse):#Treeview、列名、排列方式 selected_item = tree.selection() for item in selected_item: item_t=tree.item(item,"values") l = [(tv.set(k, col), k) for k in tv.get_children('')] #print(tv.get_children('')) l.sort(reverse=reverse)#排序方式 # rearrange items in sorted positions for index, (val, k) in enumerate(l):#根据排序后索引移动 tv.move(k, '', index) #print(k) tv.heading(col, command=lambda: treeview_sort_column(tv, col, not reverse))#重写标题,使之成为再点倒序的标题 def treeviewClick(event): selected_item = tree.selection() if len(selected_item)>0: #单击空白处不触发事件 for item in selected_item: item_text=tree.item(item,"values") T1.delete(0) T1.insert(0,item_text[0]) T2.delete(0,tk.END) T2.insert(0,item_text[1]) def stu_insert(): s_num=T1.get() s_name=T2.get() s_grade=cmb.get() insert_flag=mysql.insert(s_num,s_name,s_grade) if insert_flag == "插入成功": tree.insert('','end',values=[s_num,s_name,s_grade]) ## 显示插入行 messagebox.showinfo(title='提示', message=insert_flag) else: messagebox.showinfo(title='提示', message=insert_flag) def stu_show(): stu = mysql.query_stu() i=0 #定义列 #tree['columns'] = ('学号','姓名','年级') #设置列 tree.column('学号',width=100) tree.column('姓名',width=100) tree.column('年级',width=100) #设置表头 tree.heading('学号',text='学号') tree.heading('姓名',text='姓名') tree.heading('年级',text='年级') x=tree.get_children() for item in x: tree.delete(item) for row in stu: tree.insert('','end',values=row) def stu_delete(): selected_item = tree.selection() for item in selected_item: item_text=tree.item(item,"values") #print(item_text) delete_flag = mysql.delete(item_text[0]) if delete_flag == "删除成功": tree.delete(selected_item)## 显示上删除选中行 messagebox.showinfo(title='提示', message=delete_flag) else: messagebox.showinfo(title='提示', message=delete_flag) def stu_update(): selected_item = tree.selection() for item in selected_item: item_text=tree.item(item,"values") #print(item_text) delete_flag = mysql.delete(item_text[0]) if delete_flag == "删除成功": tree.delete(selected_item)## 显示上删除选中行 s_num=T1.get() s_name=T2.get() s_grade=cmb.get() insert_flag=mysql.insert(s_num,s_name,s_grade) if insert_flag == "插入成功": tree.insert('','end',values=[s_num,s_name,s_grade]) ## 显示插入行 messagebox.showinfo(title='提示', message="更新成功") else: messagebox.showinfo(title='提示', message="更新失败") window = tk.Tk() window.title('INSERT STUDENT') window.geometry('1000x600') mysql = mysql1.Mysql() frame1 = tk.Frame(window) frame1.pack() tk.Label(frame1, text="请输入学生信息").grid(row=0,column=0) tk.Label(frame1, text="学号").grid(row=1, column=0) dafalt_var =tk.StringVar(value='请输入') T1 = tk.Entry(frame1, bd =5,textvariable=dafalt_var) T1.grid(row=1, column=1) tk.Label(frame1, text="姓名").grid(row=2, column=0) T2 = tk.Entry(frame1, bd =5,textvariable=dafalt_var) T2.grid(row=2, column=1) tk.Label(frame1, text="年级").grid(row=3, column=0) cmb = ttk.Combobox(frame1) #cmb['value']=(1,2,3) cmb['value']=mysql.query_grade() cmb.current(0) cmb.grid(row=3, column=1) frame2 = tk.Frame(window) frame2.pack() tk.Button(frame2, text='查询', command=stu_show).grid(row=4, column=0) tk.Button(frame2, text='插入', command=stu_insert).grid(row=4, column=1) tk.Button(frame2, text='修改', command=stu_update).grid(row=4, column=2) tk.Button(frame2, text='删除', command=stu_delete).grid(row=4, column=3) tk.Button(frame2, text='退出', command=window.quit).grid(row=4, column=4) #添加查询结果界面 frame3 = tk.Frame(window) frame3.pack() colums=('学号','姓名','年级') tree =ttk.Treeview(frame3,show="headings",columns=colums) #定义排序 for col in colums: #给所有标题加(循环上边的“手工”) tree.heading(col, text=col, command=lambda _col=col: treeview_sort_column(tree, _col, False)) #绑定左键单击选中行事件 tree.bind('<ButtonRelease-1>', treeviewClick) tree.pack() window.mainloop() mysql.end()