Python课程设计

【Python课程设计】学生成绩管理系统

建立一个单机版有GUI界面的的学生成绩系统,能从文件(或数据库)中读写数据,并具有以下功能。

(1) 能输入并显示学生信息,并生成有关报表文件;

(2) 能将学生信息存储在数据库中,

(3) 能从数据库中读出学生信息;

(4) 能对学生信息进行增、删、改、查;

(5) 能计算学生的总分和各门功课的平均分;

(6) 能对学生信息进行排序;

(7) 能得到排序后的报表文件。


一、先创建一个数据库连接文件db.py

我这里用的是MySQL,先得导入一个pymysql的库。

import PyMySQL

class pydb():
    def datadb(self,dsql):
        # 打开数据库连接
        db = PyMySQL.connect("localhost", "root", "root", "pyStudent", charset='utf8')

        # 使用cursor()方法获取操作游标
        cursor = db.cursor()

        # sql = "select * from student"
        self.sql = dsql
        # 使用execute方法执行SQL语句
        cursor.execute(self.sql)
        # 使用 fetchone() 方法获取一条数据
        data = cursor.fetchall()
        #提交事务
        db.commit()
        # 关闭数据库连接
        db.close()
        #返回数据
        return data

二.创建一个index.py创建界面,再创建一个controller.py来存放控制器

导入tk库以及控制器文件

from tkinter import *
import tkinter.ttk as tk
import tkinter.messagebox  # 这个是消息框,对话框的关键
from controller import controller

2.开始画界面

1、设置好界面大小及位置

root = Tk()
root.title("学生成绩管理系统")
# 窗口宽高 英文X
root.geometry('600x500')
# 固定窗口
root.resizable(width=False, height=False)
Label(root, text='学生成绩管理', bg='white', fg='red', font=('宋体', 15)).pack(side=TOP, fill='x')
Label(root, text="学号").place(x=80, y=60)

 2、开始画内部样式

Entry(root, width=20, textvariable=u).place(x=115, y=60)
Button(root, text="查询", width=8, command=search).place(x=270, y=55)
Button(root, text="成绩排名", width=8, command=paiMing).place(x=370, y=55)
Button(root, text="生成学生信息报表", width=16, command=baobiao).place(x=450, y=55)

tree = tk.Treeview(root, columns=['1', '2', '3', '4', '5', '6', '7'], show='headings')
tree.place(x=1, y=100)
tree.column('1', width=85, anchor='center')
tree.column('2', width=85, anchor='center')
tree.column('3', width=85, anchor='center')
tree.column('4', width=85, anchor='center')
tree.column('5', width=85, anchor='center')
tree.column('6', width=85, anchor='center')
tree.column('7', width=85, anchor='center')

tree.heading('1', text='学号')
tree.heading('2', text='姓名')
tree.heading('3', text='性别')
tree.heading('4', text='数学')
tree.heading('5', text='英语')
tree.heading('6', text='语文')
tree.heading('7', text='总成绩')

Label(root, text="输入数据").place(x=10, y=340)
Entry(root, width=8, textvariable=a).place(x=75, y=340)
Entry(root, width=8, textvariable=b).place(x=150, y=340)
Entry(root, width=8, textvariable=c).place(x=225, y=340)
Entry(root, width=8, textvariable=d).place(x=300, y=340)
Entry(root, width=8, textvariable=e).place(x=375, y=340)
Entry(root, width=8, textvariable=f).place(x=450, y=340)
Button(root, text="增加数据", width=8, command=zengjia).place(x=520, y=335)


Label(root, text="更改数据").place(x=10, y=380)
Entry(root, width=8,textvariable=g).place(x=75, y=380)
Entry(root, width=8,textvariable=h).place(x=150, y=380)
Entry(root, width=8,textvariable=i).place(x=225, y=380)
Entry(root, width=8,textvariable=j).place(x=300, y=380)
Entry(root, width=8,textvariable=k).place(x=375, y=380)
Entry(root, width=8,textvariable=l).place(x=450, y=380)
Button(root, text="更新", width=8, command=gengxin).place(x=520, y=375)
Button(root, text="删除该学生信息", width=16, command=shanchu).place(x=230, y=435)

root.mainloop()

3、开始添加增删改查的功能

def search():  # 模糊查询
    # print(u.get()) #获取输入框中数据

    x = tree.get_children()  # 清空所有页面数据
    for i in x:
        tree.delete(i)

    data = con.cha(u.get())  # 获取数据
    for i in range(len(data)):  # 数据输出
        tree.insert('', 'end', values=data[i])


def paiMing():  # 分数排名
    x = tree.get_children()  # 清空所有页面数据
    for i in x:
        tree.delete(i)
    data = con.pai()
    for i in range(len(data)):  # 数据输出
        tree.insert('', 'end', values=data[i])

def zengjia():
    s = [a.get(), b.get(), c.get(), d.get(), e.get(), f.get()]  # 写入数据源
    for i in range(6):  # 判断输入是否有空值
        if (s[i] == ''):
            tkinter.messagebox.showinfo('信息', '信息不完整')
            break
    else:  # python break 无法跳出两层,需用for()....else...来解决
        con.zeng(s)  # 将数据源交于控制器方法传入数据库
        search()  # 再次查询

这里就不一一列出来了,大致一样,主界面的功能都是调用控制器里面的方法来完成的。 

 2.编写控制器

1、导入数据库文件,创建一个类使得再index页面中实现。

import db
class controller():
    global dat
    dat = db.pydb()  # 创建数据库象

 2、功能实现,就是通过操纵一些SQL语句,以及数据之间的排序重组。

    def cha(self,id):   #学号模糊查询
        self.id = id
        sql = "select * from student where id like '%"+self.id+"%'"
        x = list(dat.datadb(sql))  # 获取数据 将数据由元组改为列表
        for i in range(len(x)):     #每层数据都要改为列表
            x[i] = list(x[i])
            n = x[i][3]+x[i][4]+x[i][5]     #增加总成绩
            x[i].append(n)
        return x

    def pai(self):  #成绩排名
        sql = "select * from student"
        x = list(dat.datadb(sql))  # 获取数据 将数据由元组改为列表
        for i in range(len(x)):     #每层数据都要改为列表
            x[i] = list(x[i])
            n = x[i][3]+x[i][4]+x[i][5]     #增加总成绩
            x[i].append(n)

        for i in range(1, len(x)):
            # 从第二个元素开始,每次取出一个元素,插入前面的序列使其有序
            for j in range(i, 0, -1):   #插入排序
                if x[j][6] > x[j - 1][6]:
                    x[j], x[j - 1] = x[j - 1], x[j]
        return x


    def biao(self):
        x = self.pai()  #调用排序表
        for i in range(len(x)):  #将数据全部转为str
            for j in range(7):
                x[i][j]=str(x[i][j])

        t = [["学号","姓名","性别","数学","英语","语文","排名"]]+x    #增加表头

        f = open("k.txt", "w")
        for i in range(len(t)):  #换行写入
            for j in range(7):
                f.write(t[i][j]+' ')
            f.write('\n')
        print("打印啦")
        f.close()

    def zeng(self,s):
        self.s = s
        # try:
        sql = "insert into student values(%d,'%s','%s',%d,%d,%d)" % (self.s[0],self.s[1],self.s[2],self.s[3],self.s[4],self.s[5])
        dat.datadb(sql)     #插入数据

    def geng(self,s):
        self.s=s
        sql="update student set name ='"+self.s[1]+"',sex='"+self.s[2]+"',math="+self.s[3]+",chinese="+self.s[4]+",english="+self.s[5]+" where id ="+self.s[0]
        dat.datadb(sql)  # 更新数据

    def shan(self,n):
        self.n = n
        sql = "delete from student where id="+self.n
        dat.datadb(sql) #删除数据

3、界面实现 

附:源代码下载地址

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值