Python语言程序设计实验(4)—— Python数据分析与GUI

实验1:NumPy数据分析

题目描述:

利用NumPy库完成2项编程任务。实验效果如下图所示。

(1)创建一个一维数组arr1,存放10个[10, 99]随机整数,计算其最大值,最小值和平均值。

(2)创建一个二维数组arr2,存放5行5列共25个[10, 99]随机整数,计算其最大值,最小值和平均值。

提示:使用numpy.array( )函数创建,通过列表生成数组对象。

在这里插入图片描述

import numpy
from numpy import *
import random

#(1)创建一维数组
print("一维数组:",end='')
list1=[]
for i in range(10):
    n=int(random.random()*90+10)#范围:n in [10,99]
    list1.insert(i,n)  
arr1=numpy.array(list1)#通过一维列表创建一维数组
print(arr1)#显示一维数组

#计算最大值,最小值和平均值
print("数据分析:",end='')
max1=arr1[0]; min1=arr1[0]; avg1=arr1[0]
for i in range(1,10):
    if max1<arr1[i]:max1=arr1[i]
    if min1>arr1[i]:min1=arr1[i]
    avg1+=arr1[i]
avg1=avg1/10
print("最大值=",max1,"最小值=",min1,"平均值=",avg1)

print("----------------------------------------")

#(2)创建二维数组
print("二维数组:",end='\n')
list2=[]
for i in range(5):
    temp=[]
    for j in range(5):
        n=int(random.random()*90+10)# 范围:n in [10,99]
        temp.insert(j,n)        
    list2.insert(i,temp)
arr2=numpy.array(list2)#通过二维列表创建二维数组
print(arr2)#显示二维数组

#计算最大值,最小值和平均值
print("数据分析:",end='')
max2=arr2[0][0]; min2=arr2[0][0]; avg2=0.0
for i in range(5):
    for j in range(5):
        if max2<arr2[i][j]:max2=arr2[i][j]
        if min2>arr2[i][j]:min2=arr2[i][j]
    avg2+=arr2[i][j]
avg2=avg2/25
print("最大值=",max2,"最小值=",min2,"平均值=",avg2)

实验2:SciPy数据分析

题目描述:

利用SciPy库完成2项编程任务。

(1)求解线性方程组。如下图所示。

在这里插入图片描述

(2)图像处理。预处理灰度图片效果如图2-2;平移处理未自动填充图片效果如图2-3;平移处理自动填充图片效果如图2-4;旋转处理图片效果如图2-5所示。

提示:使用scipy.mat( )和scipy.linalg.solve( )对线性方程求解;

使用scipy.ndimage和scipy.misc库对图像进行处理。使用pylab内部图库

在这里插入图片描述
在这里插入图片描述

import numpy
import scipy
#from scipy import linalg
from numpy import linalg

#(1)线性方程组求解
print("方程求解:",end='\n')
a=scipy.mat("[5 2 3; 2 3 -4; 3 -4 -5]")
b=scipy.mat("[6; 7; 8]")
result=linalg.solve(a,b)
print(result)

print("----------------------------------------")
#(2)图像处理
from scipy import ndimage
from scipy import misc
import pandas
import matplotlib
import pylab as pl

ascent=misc.ascent()
shifted_ascent=ndimage.shift(ascent,(50,50))
shifted_ascent2=ndimage.shift(ascent,(50,50),mode="nearest")
rotated_ascent=ndimage.rotate(ascent,30)

#1)预处理灰度图片
pl.imshow(ascent,cmap=pl.cm.gray)
pl.figure()

#2)平移处理后的图片(未自动填充)
pl.imshow(shifted_ascent,cmap=pl.cm.gray)
pl.figure()

#3)平移处理后的图片(自动填充)
pl.imshow(shifted_ascent2,cmap=pl.cm.gray)
pl.figure()

#4)旋转处理后的图片
pl.imshow(rotated_ascent,cmap=pl.cm.gray)
pl.show()

实验3:Pandas数据分析

题目描述:

利用Pandas库完成2项编程任务。

(1)利用列表、元组和字典分别创建3个一级索引的数据结构Series。实验效果如图3-1所示。

(2)利用字典和Series分别创建2个二级索引的数据结构DataFrame。实验效果如图3-2所示。

提示:使用pandas.Series( )和pandas.DataFrame( )分别创建一维Series和二维DataFrame数据结构;

在这里插入图片描述

#(1)创建3个一级索引的Series数据结构
from pandas import Series #从pandas库中引用Series
print("创建3个一级索引的Series数据结构:",end='\n')
obj_list=[98,88,78,68]
obj_tuple=("C++程序设计","Python程序设计","Java程序设计","物联网工程")
obj_dict={"201801":["张珊",18,"女","计算机1801"],
          "201802":["李斯",19,"男","计算机1802"],
          "201803":["王武",18,"男","计算机1803"],
          "201804":["赵柳",19,"女","计算机1804"]}
series_list=Series(obj_list,index=["No1","No2","No3","No4"])
series_tuple=Series(obj_tuple,index=["cId0001","cId0002","cId0003","cId0004"])
series_dict=Series(obj_dict)
print("(1)通过列表创建第一个Series数据结构:");print(series_list)
print("(2)通过元组创建第二个Series数据结构:");print(series_tuple)
print("(3)通过字典创建第三个Series数据结构:");print(series_dict)

print("----------------------------------------")
#(2)创建2个二级索引(行索引和列索引)的DataFrame数据结构
from pandas import DataFrame #从pandas库中引用DataFrame
print("创建2个二级索引的DataFrame数据结构:",end='\n')
obj1={"学号":["201801","201802","201803","201804","201801"],
     "姓名":["张珊","李斯","王武","赵柳","周琪"],
     "年龄":[18,19,19,18,18],
     "性别":["女","男","男","女","女"],
     "班级":["计算机1801","计算机1802","计算机1803","计算机1804","计算机1801"]
     }
dataframe_obj1=DataFrame(obj1)
print("(1)通过字典创建第一个DataFrame数据结构(学生信息):")
print(dataframe_obj1)

series_list1=Series(["2001020","张珊",38,"女","副教授"],index=["工号","姓名","年龄","性别","职称"])
series_list2=Series(["2001021","李斯",39,"男","副教授"],index=["工号","姓名","年龄","性别","职称"])
series_list3=Series(["2001023","王武",39,"男","副教授"],index=["工号","姓名","年龄","性别","职称"])
series_list4=Series(["2001024","赵柳",38,"女","副教授"],index=["工号","姓名","年龄","性别","职称"])
series_list5=Series(["2001025","周琪",38,"女","副教授"],index=["工号","姓名","年龄","性别","职称"])
dataframe_obj2=DataFrame([series_list1,series_list2,series_list3,series_list4,series_list5])
print("(2)通过Series创建第二个DataFrame数据结构(教师信息):")
print(dataframe_obj2)

实验4:Matplotlib数据可视化

题目描述:

利用CSV、Random、Datetime、Pandas和Matplotlib库完成5项编程任务。

(1)利用csv、random和datetime创建1个WPF商店2018年营业额模拟数据文件data.csv,此文件中包含两列数据(日期date、销量amount)。模拟数据随机生成共365条,数据日期date起于2018-01-01止于2018-12-31,数据销量amount的取值范围为[300,600]之间,如图4-1所示。
在这里插入图片描述
(2)利用pandas读取文件data.csv中数据,创建1个行列索引的数据结构DataFrame,并删除其中的所有缺失值。

(3)利用matplotlib生成折线图,按每天进行统计,显示商店每天的销量情况,并把图形保存为本地文件day_amount_plot.png。实验效果如图4-2所示。
在这里插入图片描述
(4)利用matplotlib生成柱状图,按月份进行统计,显示商店每月的销量情况,并把图形保存为本地文件month_amount_bar.png。实验效果如图4-3所示。同时,找出相邻两个月最大涨幅,并把涨幅最大的月份写入到文件maxMonth.txt中。
在这里插入图片描述
(5)利用matplotlib生成饼状图,按季度进行统计,显示商店4个季度的销量分布情况,并把图形保存为本地文件season_amount_pie.png。实验效果如图4-4所示。
在这里插入图片描述
提示:使用pandas.DataFrame( )创建二维DataFrame数据结构;使用matplotlib.pyplot库中的figure( )、plot( )、bar( )、pie( )、title( )、savefig( )和show( )等创建数据可视化图片,其功能分别设置图片大小、生成这线图、生成柱状图、生成饼状图、设置图片标题、保存图片和显示图片等。

#(1)首先,在当前文件夹中生成WPF商店2018年营业额模拟数据文件data.csv
import csv,random,datetime
with open(r"data.csv","w+",newline='') as csvfile:#创建csv文件对象
    wr=csv.writer(csvfile,dialect="excel")#创建csv文件写入对象
    wr.writerow(["date","amount"])#写入标题:日期date、销量amount    
    startDate=datetime.date(2018,1,1)#初始日期2018-01-01    
    for i in range(365):#生成365个模拟数据,可以根据需要进行调整
        amount=int(random.random()*301+300)#生成一个销量模拟数据[300,600],写入csv文件
        wr.writerow([startDate,amount])#写入数据
        startDate=startDate+datetime.timedelta(days=1)#下一天

#(2)然后,完成下面5项任务
import pandas as pd
import matplotlib.pyplot as plt

#1)使用pandas读取文件data.csv中的数据,创建DataFrame对象,并删除其中所有缺失值;
df=pd.read_csv("data.csv",encoding="cp936")#读取数据
df=df.dropna()#丢弃缺失值
#print(df);#print(df.describe())#describe()可进行缺失值分析与数据离散度分析

#2)按每天进行统计,使用matplotlib生成折线图,显示商店每天的销量情况,并把图形保存为本地文件day_amount_plot.png;
plt.figure(figsize=(12,6))#设置图片大小
plt.plot(df["date"],df["amount"],label="day->amount",color="red",linewidth=2)#作图(日期,销量)
plt.title("2018 Day Business Volume of Wpf Store")#设置图标题
plt.xlabel("day")#设置x轴名称
plt.ylabel("amount") #设置y轴名称
plt.xlim("2018-01-01","2018-12-31")#显示x轴范围
#plt.ylim(300,600)#显示y轴范围,默认从0开始
plt.legend()#刻印文字,生成图例,但不显示图片,可以替换label="Month->Amount"
plt.savefig("day_amount_plot.png")#注意顺序:先保存图,后显示
plt.show()#显示作图结果

#3)按月份进行统计,使用matplotlib生成柱状图,显示商店每月的销量情况,并把图形保存为本地文件second.png;
df1=df#初始化新df1
df1["month"]=df1["date"].map(lambda x: x[:x.rindex('-')])
df1=df1.groupby(by="month",as_index=False).sum()
#print(df1)#可查看df1的内容
plt.figure(figsize=(12,6))
plt.bar(df1["month"],df1["amount"],label="month->amount",color="blue")
plt.title("2018 Month Business Volume of Wpf Store")#设置图标题
plt.xlabel("month")#设置x轴名称
plt.ylabel("amount") #设置y轴名称
plt.xlim("2018-01","2018-12")#显示x轴范围
#plt.ylim(300,600)#显示y轴范围,默认从0开始
plt.legend()#刻印文字,生成图例,但不显示图片,可以替换label="Month->Amount"
plt.savefig("month_amount_bar.png")#注意顺序:先保存图,后显示
plt.show()#显示作图结果

#4)按月份进行统计,找出相邻两个月最大涨幅,并把涨幅最大的月份写入文件maxMonth.txt;
df2=df1.drop("month", axis=1).diff()
m=df2["amount"].nlargest(1).keys()[0]
with open("max_month.txt", 'w') as txtfile:
    txtfile.write(df1.loc[m,"month"])
txtfile.close()

#5)按季度进行统计,使用matplotlib生成饼状图,显示商店4个季度的销量分布情况,并把图形保存为本地文件third.jpg。
season1= df1[:3]['amount'].sum()    #第1季度(01-03月)数据统计
season2 = df1[3:6]['amount'].sum()  #第2季度(04-06月)数据统计
season3= df1[6:9]['amount'].sum()   #第3季度(07-09月)数据统计
season4= df1[9:12]['amount'].sum()  #第4季度(10-12月)数据统计
plt.figure(figsize=(12,6))
plt.pie([season1, season2, season3, season4],labels=["season1", "season2", "season3", "season4"])
plt.title("2018 Season Business Volume of Wpf Store")#设置图标题
plt.savefig('season_amount_pie.png')
plt.show()

csvfile.close()#关闭文件

实验5:简单GUI编程-学生成绩统计

题目描述:

利用tkinter库完成2项GUI编程任务。

(1)利用tkinter库设计1个如图5-1所示的GUI图形界面。

(2)利用GUI面向对象编程方式实现学生四门课程的平均成绩计算功能。
在这里插入图片描述
提示:利用tkinter生成窗体、标签、文本框、命令按钮;利用grid实现窗体布局;利用GUI面向对象编程方式实现GUI编程封装。

from tkinter import *
from tkinter import messagebox
class ScoreCalculate:
    def __init__(self):
        win = Tk()
        win.geometry("300x250")
        win.title("学生成绩统计")
        
        lblCpp=Label(win, text="C/C++程序设计")#创建Label标签
        lblCpp.grid(row=0, column=0, padx=5, pady=5, sticky="e")#使用grid进行布局
        self.vCpp=IntVar();
        self.vCpp.set(90) #使用self,并设置初值
        entCpp=Entry(win, width=15, textvariable=self.vCpp)#创建Entry对象
        entCpp.grid(row=0, column=1, padx=5, pady=5, sticky="w")#使用grid进行布局

        lblPython=Label(win,text="Python程序设计")
        lblPython.grid(row=1, column=0, padx=5, pady=5, sticky="e")
        self.vPython=IntVar();
        self.vPython.set(96)
        entPython=Entry(win, width=15, textvariable=self.vPython)
        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.vJava=IntVar();
        self.vJava.set(88)
        entJava=Entry(win, width=15, textvariable=self.vJava)
        entJava.grid(row=2, column=1, padx=5, pady=5, sticky="w")

        lblIoT=Label(win, text="物联网工程")
        lblIoT.grid(row=3, column=0, padx=5, pady=5, sticky="e")
        self.vIoT=IntVar();
        self.vIoT.set(98)
        entIoT=Entry(win, width=15, textvariable=self.vIoT)
        entIoT.grid(row=3, column=1, padx=5, pady=5, sticky="w")

        btnCalculate=Button(win, text="计算平均成绩", command=self.Calculate)
        btnCalculate.grid(row=4, column=0, columnspan=2, pady=5)
        
        lblAvg= Label(win, text="平均成绩:")
        lblAvg.grid(row=5, column=0, padx=5, pady=5, sticky="e")
        self.vAvg=DoubleVar()#有精度
        entAvg=Entry(win, width=15, state="readonly",textvariable=self.vAvg)#显示数据 
        entAvg.grid(row=5, column=1, padx=5, pady=5, sticky="w")
        win.mainloop()

    def Calculate(self):
        try:
            xCpp=float(self.vCpp.get())#获取C++成绩
            xPython=float(self.vPython.get())#获取Python成绩            
            xJava=float(self.vJava.get())#获取Java成绩
            xIoT=float(self.vIoT.get())#获取IoT成绩
            xAvg=(xCpp + xPython + xJava + xIoT)/4           
            self.vAvg.set(round(xAvg, 1))#保留1位小数并输出            
        except:
            messagebox.showerror(title="提示", message="输入错误,请重新输入")
            
ScoreCalculate()

实验6:综合GUI编程-学生管理平台

题目描述:利用sqlites、tkinter、tkinter.messagebox和os库完成5项编程任务。

(1)使用SQLiteStudio.exe工具(工具来源参照第3次实验的SQLite3子实验)设计一个名为test.db数据库,库中创建两张数据表user(uid, upwd)和student(sid, sname, ssex, sage, sclass)。输入对应数据如下图所示。
在这里插入图片描述
(2)设计一个用户登录类sLogin,布局如下图所示用户登录界面,实现“登录”和“退出”功能。
在这里插入图片描述
(3)设计一个主控管理类sMain,布局如下图所示主控管理界面,设计一级水平主菜单4项,包括“学生管理”、“”“课程管理”、“成绩管理”和“退出系统”。其中主菜单“成绩管理”可设计二级下拉菜单3项,包括“录入成绩”、“查询成绩”和“统计成绩”。(可以选做:下拉菜单“查询成绩”自行设计三级级联菜单2项,包括“理论成绩”和“实验成绩”。)实现菜单的功能设计与层次管理。
在这里插入图片描述
(4)设计一个学生管理类sManage,布局如下图所示学生管理界面,实现学生“录入”、“删除”、“修改”、“查询”、“查看”和关闭6个子功能。(以下给出单个“查询”和所有“查看”功能图示)
在这里插入图片描述
(5)通过菜单集成关联窗体。程序运行流程是:首先启动登录界面,查验数据库中用户名和密码有效后,然后才能进入主控管理界面,点击“学生管理”一级主菜单,可弹出显示学生管理界面,完成学生管理添、删、改、查基本功能。(另外选做:实现“课程管理”和“成绩管理”基本功能。)
提示
(1)数据表字段类型可全部设置为varchar类型,即字符串类型;
(2)利用tkinter生成窗体、标签、文本框、命令按钮;
(3)利用grid和place实现窗体布局和控件定位;
(4)利用GUI面向对象编程方式实现GUI编程封装。
(5)利用SQL语句Insert、Delete、Update和Select实现添、删、改、查基本管理功能。

import tkinter as Tk
from tkinter import *
import tkinter.messagebox as messagebox
import sqlite3
import os

################################################################################
import tkinter as Tk
class sLogin:
    """登录界面"""
    #----------------------------------------------------------------------
    def __init__(self, login):#构造初始
        """登录界面初始"""
        self.frmLogin=login
        self.frmLogin.geometry("320x200+380+200")
        self.frmLogin.title("用户登录")
        self.frame=Tk.Frame(self.frmLogin) #windows开发:frame, web开发:(page)
        self.gridFrame()
       
    #----------------------------------------------------------------------
    def gridFrame(self):#界面布局
        """登录界面布局"""
        self.uid=StringVar(); self.uid.set("wpf")
        self.upwd=StringVar(); self.upwd.set("123")
        
        Label(self.frame).grid(row=0)#让界面先空一行
        Label(self.frame, text="学生管理平台", fg="blue", font=("黑体",20,"bold")).grid(row=1, columnspan=2)
        Label(self.frame, text="用户名", width=5).grid(row=2, column=0, padx=10, pady=10, sticky='e')
        Entry(self.frame, textvariable=self.uid).grid(row=2, column=1, pady=10, sticky='w')
        Label(self.frame, text="密   码",width=5).grid(row=3, column=0, padx=10, pady=5,  sticky='e')        
        Entry(self.frame, textvariable=self.upwd, show='*').grid(row=3, column=1, pady=5, sticky='w')
        Button(self.frame,text="登录", width=13,
               command=self.onLogin).grid(row=4, column=0, pady=10, sticky='w')
        Button(self.frame,text="退出", width=13,
               command=self.onExit).grid(row=4, column=1, pady=5, sticky='e' )        
        self.frame.pack()
        
    #----------------------------------------------------------------------
    def onLogin(self):
        """登录进入"""
        self.conn=sqlite3.connect("test.db")#连接数据库        
        cmd=self.conn.cursor()
        sql="select uid, upwd from user where uid='%s'" % self.uid.get()
        cmd.execute(sql)  #执行数据库
        ds=cmd.fetchall() #接收全部信息
        if len(ds)==0:  #值为0,表示没有找到记录, 值为1,表示有一条记录
            messagebox.showerror("登录失败", "账户不存在")
        else:
            xuid, xupwd = ds[0]
            if xuid==self.uid.get() and xupwd==self.upwd.get():
                self.hide() #隐藏窗体
                root=Tk.Tk() #主窗体,作为一级窗体比较合适
                sMain(root)
                root.mainloop()                
            else:
                messagebox.showwarning("登录失败", "密码错误")
        self.conn.close() #关闭数据库

    #----------------------------------------------------------------------
    def hide(self):
        """隐藏窗体"""
        self.frame.destroy()
        self.frmLogin.withdraw()
    
    #----------------------------------------------------------------------            
    def onExit(self): 
        """退出登录"""        
        os._exit(0)#退出系统    

################################################################################
import tkinter as Tk
class sMain(object):
    """主控界面"""
    #----------------------------------------------------------------------
    def __init__(self, parent):
        self.root=parent
        self.root.geometry("1220x600+20+10")
        self.root.title("学生管理平台v1.0")
        self.frame=Tk.Frame(self.root)        
        self.menuFrame()

    #----------------------------------------------------------------------
    def menuFrame(self):
        """设计菜单"""
        self.main=Tk.Menu(self.root)#创建主菜单
        #self.subMenu1=Menu(self.main)   #创建下拉子菜单1:学生管理
        #self.subMenu2=Menu(self.main)   #创建下拉子菜单2:课程管理
        self.subMenu3=Menu(self.main)    #创建下拉子菜单3:成绩管理        
        self.subMenu3.add_command(label="录入成绩")
        self.subMenu3.add_command(label="查询成绩")
        self.subMenu3.add_command(label="统计成绩", command=self.onCalScore)
        self.main.add_cascade(label="学生管理", command=self.onOpenStudent)
        self.main.add_cascade(label="课程管理")
        self.main.add_cascade(label="成绩管理", menu=self.subMenu3)
        self.main.add_cascade(label="退出系统", command=self.onExit)
        self.root["menu"]=self.main #显示菜单
        self.frame.pack()
        
    #----------------------------------------------------------------------   
    def onOpenStudent(self):
        """打开子窗体"""
        sub=Tk.Toplevel()#弹出顶级窗体,作为二级子窗体比较合适
        #sub=Tk.Tk()     #主窗口,一般作为一级窗口
        sManage(sub)
    
    #----------------------------------------------------------------------   
    def onCalScore(self):
        """统计成绩"""
        pass

    #----------------------------------------------------------------------  
    def onExit(self):
        """退出系统"""
        os._exit(0)#退出系统

################################################################################
import tkinter as Tk
class sManage():
    """学生管理"""
    #----------------------------------------------------------------------
    def __init__(self, child):
        """学生界面初始"""
        self.frmStudent=child
        self.frmStudent.geometry("600x400+40+70")
        self.frmStudent.title("学生管理")
        self.frame=Tk.Frame(self.frmStudent)        
        self.gridFrame()
        
    #----------------------------------------------------------------------
    def gridFrame(self):
        """学生界面布局"""
        self.sid=StringVar(); self.sid.set('')
        self.sname=StringVar(); self.sname.set('')
        self.ssex=StringVar(); self.ssex.set('')
        self.sage=StringVar(); self.sage.set('')# 编程心得:年龄类型也做成字符串
        self.sclass=StringVar(); self.sclass.set('')

        #必须使用grid布局网格,配合使用place精确定位
        Label(self.frame).grid(row=0)#界面空一行
        Label(self.frame, text="学生管理平台", fg="blue",
              font=("黑体",20,"bold")).grid(row=1, columnspan=4)#使用grid布局
        Label(self.frame, text="学  号", fg="red").grid(row=2, column=0, pady=5, sticky='w')
        Entry(self.frame, textvariable=self.sid).place(x=48, y=63) #使用place定位       
        Label(self.frame, text="姓  名").grid(row=3, column=0, pady=5, sticky='w')        
        Entry(self.frame, textvariable=self.sname).place(x=48, y=96)#使用place定位 
        Label(self.frame, text="性  别").place(x=231, y=96) #使用place定位        
        Entry(self.frame, textvariable=self.ssex).place(x=281, y=96)#使用place定位
        Label(self.frame, text="年  龄").grid(row=4, column=0, pady=5, sticky='w')        
        Entry(self.frame, textvariable=self.sage).place(x=48, y=129)#使用place定位 
        Label(self.frame, text="班  级").place(x=231, y=129) #使用place定位        
        Entry(self.frame, textvariable=self.sclass).place(x=281, y=129)#使用place定位
        Button(self.frame,text="录入", width=10, command=self.onInsert).place(x=0, y=165)#使用place定位
        Button(self.frame,text="删除", width=10, command=self.onDelete).place(x=85, y=165)
        Button(self.frame,text="修改", width=10, command=self.onUpdate).place(x=170, y=165)
        Button(self.frame,text="查询", width=10, command=self.onSelect).place(x=255, y=165)
        Button(self.frame,text="查看", width=10, command=self.onLook).place(x=340, y=165)
        Button(self.frame,text="关闭", width=10, command=self.onHide).place(x=425, y=165)
        self.vShow=StringVar();
        self.vShow.set('')
        #Text(self.frame,textvariable=self.v,width=60,height=23).grid(row=5,columnspan=4,pady=50,sticky='e')
        Listbox(self.frame, listvariable=self.vShow,
                width=72, height=9).grid(row=5, columnspan=4, pady=50, sticky='e')#height:是行数        
        self.frame.pack()

    #----------------------------------------------------------------------
    def onInsert(self):
        """录入学生"""
        self.conn=sqlite3.connect("test.db")#连接数据库        
        self.cmd=self.conn.cursor()
        
        #检查记录是否存在,不存在才能录入新学生记录
        sql="select sid, sname, ssex, sage, sclass from student where sid='%s'"%self.sid.get()
        self.cmd.execute(sql)  #执行数据库
        ds=self.cmd.fetchall() #接收全部信息
        if len(ds)==1:  #值为0,表示没有找到记录, 值为1,表示有一条记录
            messagebox.showerror("录入失败","学生" + self.sid.get() + "存在,不允许重复录入...")
        else:
            sql="insert into student(sid,sname,ssex,sage,sclass) values('%s','%s','%s','%s','%s')" \
                 %(self.sid.get(),self.sname.get(),self.ssex.get(),self.sage.get(),self.sclass.get())
            self.cmd.execute(sql)            
            self.conn.commit()#提交数据
            messagebox.showinfo("录入成功","录入学生" + self.sid.get() + "成功...")
        self.cmd.close()
        self.conn.close() #关闭数据库
        
    #----------------------------------------------------------------------
    def onDelete(self):
        """删除学生"""
        self.conn=sqlite3.connect("test.db")#连接数据库        
        self.cmd=self.conn.cursor()
        
        #检查记录是否存在,存在才能删除学生记录
        sql="select sid, sname, ssex, sage, sclass from student where sid='%s'"%self.sid.get()
        self.cmd.execute(sql)  #执行数据库
        ds=self.cmd.fetchall() #接收全部信息
        if len(ds)==0:  #值为0,表示没有找到记录, 值为1,表示有一条记录
            messagebox.showerror("删除失败","学生" + self.sid.get() + "不存在,删除失败...")
        else:
            sql="delete from student where sid='%s'"%self.sid.get()
            self.cmd.execute(sql)            
            self.conn.commit()#提交数据
            messagebox.showinfo("删除成功","删除学生" + self.sid.get() + "成功...")
        self.cmd.close()
        self.conn.close() #关闭数据库

    #----------------------------------------------------------------------
    def onUpdate(self):
        """修改学生"""
        self.conn=sqlite3.connect("test.db")#连接数据库        
        self.cmd=self.conn.cursor()
        
        #检查记录是否存在,存在才能修改学生记录
        sql="select sid, sname, ssex, sage, sclass from student where sid='%s'"%self.sid.get()
        self.cmd.execute(sql)  #执行数据库
        ds=self.cmd.fetchall() #接收全部信息
        if len(ds)==0:  #值为0,表示没有找到记录, 值为1,表示有一条记录
            messagebox.showerror("修改失败","学生" + self.sid.get() + "不存在,修改失败...")
        else:
            sql="update student set sname='%s', ssex='%s', sage='%s', sclass='%s' where sid='%s'" \
            %(self.sname.get(),self.ssex.get(),self.sage.get(),self.sclass.get(),self.sid.get())
            self.cmd.execute(sql)            
            self.conn.commit()#提交数据
            messagebox.showinfo("修改成功","修改学生" + self.sid.get() + "成功...")
        self.cmd.close()
        self.conn.close() #关闭数据库

    #----------------------------------------------------------------------
    def onSelect(self):
        """查询学生"""
        self.conn=sqlite3.connect("test.db")#连接数据库        
        self.cmd=self.conn.cursor()
        sql="select sid, sname, ssex, sage, sclass from student where sid='%s'"%self.sid.get()
        self.cmd.execute(sql)  #执行数据库
        ds=self.cmd.fetchall() #接收全部信息
        if len(ds)==0:  #值为0,表示没有找到记录, 值为1,表示有一条记录
            messagebox.showerror("查询失败","查询学生" + self.sid.get() + "不存在...")
        else:
            xsid, xsname, xssex, xsage, xsclass = ds[0]
            self.sid.set(xsid)
            self.sname.set(xsname)
            self.ssex.set(xssex)
            self.sage.set(xsage)
            self.sclass.set(xsclass)
            strResult=xsid+','+xsname+','+xssex+','+xsage+','+xsclass #注意:不用空格,而用逗号分隔
            self.vShow.set(strResult) #列表框中以空格分割元素进入列表中        
        self.cmd.close()
        self.conn.close() #关闭数据库

    def onLook(self):
        """查看学生"""
        self.conn=sqlite3.connect("test.db")#连接数据库        
        self.cmd=self.conn.cursor()
        sql="select sid, sname, ssex, sage, sclass from student"
        self.cmd.execute(sql)  #执行数据库
        ds=self.cmd.fetchall() #接收全部信息
        if len(ds)==0:  #值为0,表示没有找到记录, 值为1,表示有一条记录
            messagebox.showerror("查看失败","查询学生" + self.sid.get() + "不存在...")
        else:
            strResult=''
            for i in range(len(ds)):
                xsid, xsname, xssex, xsage, xsclass = ds[i]
                strResult+=xsid+','+xsname+','+xssex+','+xsage+','+xsclass+' ' #注意:不用空格,而用逗号分隔
            self.vShow.set(strResult) #列表框中以空格分割元素进入列表中        
        self.cmd.close()
        self.conn.close() #关闭数据库

    #----------------------------------------------------------------------
    def onHide(self):
        """隐藏窗体"""
        self.frame.destroy()
        self.frmStudent.withdraw()

################################################################################
import tkinter as Tk
if __name__=="__main__":
    """主程序启动入口"""
    login=Tk.Tk()
    sLogin(login)#登录窗体为第一启动对象       
    login.mainloop()
  • 24
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小天才才

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值