题目描述:利用sqlite3、tkinter、tkinter.messagebox库完成2项编程任务。
(1)使用SQLiteStudio.exe工具设计test.db数据库,创建图2-1所示学生数据表student(sid, sname, ssex, sage, sclass),输入如图2-2所示数据。
数据表结构
数据表内容
(2)设计如图3所示学生管理界面,实现学生“录入”、“删除”、“修改”、“查询”、“查看”和关闭6个子功能。(以下给出单个“查询”和所有“查看”功能图示)
import tkinter as tk
from tkinter import *
import tkinter.messagebox as messagebox
import sqlite3
t = tk.Tk()
t.geometry('800x400')
t.title('学生信息管理')
sid = tk.StringVar()
sid.set('')
sname = tk.StringVar()
sname.set('')
sage = tk.StringVar()
sage.set('')
ssex = tk.StringVar()
ssex.set('')
sclass = tk.StringVar()
sclass.set('')
def Insert():
conn = sqlite3.connect(r"test.db")
cmd = conn.cursor()
sql = "select sid, sname, ssex, sage, sclass from student where sid='%s'" % sid.get()
cmd.execute(sql)
ds = cmd.fetchall()
if len(ds) == 1:
messagebox.showerror("录入失败", "学生" + sid.get() + "存在,不允许重复录入...")
else:
sql = "insert into student values('%s','%s','%s','%d','%s')" % (
sid.get(), sname.get(), ssex.get(), int(sage.get()), sclass.get())
cmd.execute(sql)
conn.commit()
messagebox.showinfo("录入成功", "录入学生" + sid.get() + "成功...")
cmd.close()
conn.close()
def Delete():
conn = sqlite3.connect(r"test.db")
cmd = conn.cursor()
sql = "select sid, sname, ssex, sage, sclass from student where sid='%s'" % sid.get()
cmd.execute(sql)
ds = cmd.fetchall()
if len(ds) == 0:
messagebox.showerror("删除失败", "学生" + sid.get() + "不存在,删除失败...")
else:
sql = "delete from student where sid='%s'" % sid.get()
cmd.execute(sql)
conn.commit()
messagebox.showinfo("删除成功", "录入学生" + sid.get() + "存在,成功...")
cmd.close()
conn.close()
def Updata():
conn = sqlite3.connect("test.db")
cmd = conn.cursor()
sql = "select sid, sname, ssex, sage, sclass from student where sid='%s'" % sid.get()
cmd.execute(sql)
ds = cmd.fetchall()
if len(ds) == 0:
messagebox.showerror("修改失败", "学生" + sid.get() + "不存在,修改失败...")
else:
sql = "update student set sname='%s', ssex='%s', sage='%s', sclass='%s' where sid='%s'" \
% (sname.get(),ssex.get(), sage.get(),sclass.get(), sid.get())
cmd.execute(sql)
conn.commit()
messagebox.showinfo("修改成功", "修改学生" + sid.get() + "成功...")
cmd.close()
conn.close()
def Select():
conn = sqlite3.connect("test.db")
cmd = conn.cursor()
sql = "select sid, sname, ssex, sage, sclass from student where sid='%s'" % sid.get()
cmd.execute(sql)
ds = cmd.fetchall()
if len(ds) == 0:
messagebox.showerror("查询失败", "查询学生" + sid.get() + "不存在...")
else:
xsid, xsname, xssex, xsage, xsclass = ds[0]
sid.set(xsid)
sname.set(xsname)
ssex.set(xssex)
sage.set(xsage)
sclass.set(xsclass)
strResult = xsid + ',' + xsname + ',' + xssex + ',' + xsage + ',' + xsclass
vShow.set(strResult)
cmd.close()
conn.close()
def Look():
conn=sqlite3.connect("test.db")
cmd=conn.cursor()
sql="select sid, sname, ssex, sage, sclass from student"
cmd.execute(sql)
ds=cmd.fetchall()
if len(ds)==0:
messagebox.showerror("查看失败","查询学生" + sid.get() + "不存在...")
else:
strResult=''
for i in range(len(ds)):
xsid, xsname, xssex, xsage, xsclass = ds[i]
strResult+=xsid+','+xsname+','+xssex+','+xsage+','+xsclass+' '
vShow.set(strResult)
cmd.close()
conn.close()
def Hide():
t.destroy()
t.withdraw()
tk.Label(t).grid(row=0)
a=tk.Label(t, text="学生管理平台", fg="blue", font=("黑体",20,"bold"))
a.grid(row=1, columnspan=4)
label1 = tk.Label(t,text='学 号',fg='red')
label1.grid(row=2,column=0,pady=5,sticky='e')
tk.Entry(t, textvariable=sid).grid(row=2, column=1, pady=5, sticky='w')
label1 = tk.Label(t,text='姓 名')
label1.grid(row=3,column=0,pady=5,sticky='e')
tk.Entry(t, textvariable=sname).grid(row=3, column=1, pady=5, sticky='w')
label3 = tk.Label(t,text='性 别')
label3.grid(row=3,column=2,pady=5,sticky='e')
tk.Entry(t, textvariable=ssex).grid(row=3, column=3, pady=5, sticky='w')
label4 = tk.Label(t,text='年 龄')
label4.grid(row=4,column=0,pady=5,sticky='e')
tk.Entry(t, textvariable=sage).grid(row=4, column=1, pady=5, sticky='w')
label6 = tk.Label(t,text='班级')
label6.grid(row=4,column=2,pady=5,sticky='e')
tk.Entry(t, textvariable=sclass).grid(row=4, column=3, pady=5, sticky='w')
Button(t,text="录入", width=10, command=Insert).place(x=0, y=165)
Button(t,text="删除", width=10, command=Delete).place(x=85, y=165)
Button(t,text="修改", width=10, command=Updata).place(x=170, y=165)
Button(t,text="查询", width=10, command=Select).place(x=255, y=165)
Button(t,text="查看", width=10, command=Look).place(x=340, y=165)
Button(t,text="关闭", width=10, command=Hide).place(x=425, y=165)
main=tk.Menu(t)
ins = tk.Menu(main)
ins.add_command(label='录入',command=Insert)
main.add_cascade(label='信息管理',menu=ins)
t['menu']=main
vShow=StringVar();
vShow.set('')
Listbox(t,listvariable=vShow,width=72, height=9).grid(row=10, columnspan=3,padx=50, pady=50, sticky='e')
t.mainloop()
实验5.1:简单GUI编程-学生成绩统计
题目描述:利用tkinter库完成2项GUI编程任务。
- 设计如图1所示GUI图形界面;
(2)计算学生四门课程的平均成绩。
import tkinter as tk
t = tk.Tk();
t.geometry('400x300')
t.title('示例')
def f():
v1 = float(ent1.get())
v2 = float(ent3.get())
v3 = float(ent4.get())
v4 = float(ent5.get())
v = v1+v2+v3+v4
result.set(v / 4)
result = tk.StringVar()
label1 = tk.Label(t,text='C/C++程序设计:')
label1.grid(row=0,column=0,padx=5,pady=5,sticky='e')
ent1 = tk.Entry(t,width=15)
ent1.grid(row=0,column=1,padx=5,pady=5,sticky='e')
button1 = tk.Button(t,text='计算平均成绩',command=f)
button1.grid(row=4,column=1,padx=5,pady=5,sticky='w')
label2 = tk.Label(t,text='结果')
label2.grid(row=5,column=0,padx=5,pady=5,sticky='e')
ent2 = tk.Entry(t,width=15,textvariable=result)
ent2.grid(row=5,column=1,padx=5,pady=5,sticky='e')
label3 = tk.Label(t,text='Python程序设计:')
label3.grid(row=1,column=0,padx=5,pady=5,sticky='e')
ent3 = tk.Entry(t,width=15)
ent3.grid(row=1,column=1,padx=5,pady=5,sticky='e')
label4 = tk.Label(t,text='Java程序设计:')
label4.grid(row=2,column=0,padx=5,pady=5,sticky='e')
ent4 = tk.Entry(t,width=15)
ent4.grid(row=2,column=1,padx=5,pady=5,sticky='e')
label5 = tk.Label(t,text='物联网工程:')
label5.grid(row=3,column=0,padx=5,pady=5,sticky='e')
ent5 = tk.Entry(t,width=15)
ent5.grid(row=3,column=1,padx=5,pady=5,sticky='e')
t.mainloop()
实验5.3:扩展实验1
题目描述:编写面向对象代码完成实验5.1。
import tkinter as tk
from tkinter import *
from tkinter import messagebox
class CalStdScore:
def __init__(self):
win=Tk()
win.geometry('256x192')
win.title('统计学生成绩')
lblCpp=Label(win,text='C/C++程序设计')
lblCpp.grid(row=0,column=0,padx=5,pady=5,sticky='e')
self.vCppScore=IntVar()
entCpp=Entry(win,width=15,textvariable=self.vCppScore)
entCpp.grid(row=0,column=1,padx=5,pady=5,sticky='w')
lblPython = Label(win, text='Python程序设计')
lblPython.grid(row=1, column=0, padx=5, pady=5, sticky='e')
self.vPythonScore = IntVar()
entPython = Entry(win, width=15, textvariable=self.vPythonScore)
entPython.grid(row=1, column=1, padx=5, pady=5, sticky='w')
lblJava = Label(win, text='Java程序设计')
lblJava.grid(row=2, column=0, padx=5, pady=5, sticky='e')
self.vJavaScore = IntVar()
entJava = Entry(win, width=15, textvariable=self.vJavaScore)
entJava.grid(row=2, column=1, padx=5, pady=5, sticky='w')
btnCalCulate=Button(win,text='统计学生成绩',command=self.Calculate,width=15,height=1)
btnCalCulate.grid(row=3,column=0,columnspan=2,pady=5)
win.mainloop()
def Calculate(self):
try:
xCppScore=int(self.vCppScore.get())
xPythonScore=int(self.vPythonScore.get())
xJavaScore=int(self.vJavaScore.get())
xAvgScore=(xCppScore+xPythonScore+xJavaScore)//3
xMaxScore=max(xCppScore,xPythonScore,xJavaScore)
xMinScore=min(xCppScore,xPythonScore,xJavaScore)
str1='平均成绩:'+str(xAvgScore)+'\n'\
+'最大成绩'+str(xMaxScore)+'\n'\
+'最小成绩'+str(xMinScore)
messagebox.showinfo(title='统计成绩',message=str1)
except:
messagebox.showinfo(title='提示',message='输入错误,重新输入')
CalStdScore()