編寫一個簡單學生情況錄入界面,配合后端數據庫,實現數據的增、改、刪功能
數據庫准備:
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()