精华内容
下载资源
问答
  • 学生信息表格图片
    2021-07-11 04:02:39

    一、教学设计学科名称

    小学信息技术教学设计《插入表格》

    二、所在班级情况、学生特点分析

    我所教学生为五年级学生,小学生年龄小,好动性、好奇性强。学生通过前面几节课的学习,学生在实践的过程中已经逐步掌握了在word中输入文字及修改、修饰段落、插入图片和艺术字等基本的知识,看着自己亲手制作的作品,探究的兴趣愈来愈浓厚,课间师生之间、同学之间的交流也很多,这位接下来的探究活动打下了很好的思想基础。但依然是个别学生的学习效果不明显,希望通过师生的交流,能帮这些同学找到失误的原因。

    三、教学内容分析

    在本节课中,学生将会学到:

    1.自动绘制表格;

    2.编辑表格;

    3.修饰表格。

    四、教学目标

    1.学会在Word中制作简单的表格,并输入文字。

    2.在操作过程中培养学生的自学探究能力和合作能力,培养学生的审美情趣和创新精神。

    五、教学难点分析

    制作简单的表格,学生对表格的修饰有点难度,可以联系生活实际,进行讲解。

    六、教具准备

    1.多媒体课件。

    2.课前收集生活中的表格。如,电话缴费单、超市的电脑小票、课程表、送货单等等(让学生对表格有初步感知)

    七、教学课时

    1课时。

    八、教学过程

    (一)、创设情境,揭示课题

    师:同学们好!大家还记得在第一课中,老师给你们展示的漂亮的板报样板吗?其中的图片、文字等我们已经会做了,但是,样表中还有一张“学生信息表”,如果我们能把自己的信息表输入到电脑,美化并打印出来,那就太令人兴奋了!同学们愿不愿意把我们的信息表制作得漂亮美观呢?

    生:愿意。学生异口同声地回答。

    (以“板报样表”来引出制作表格,自然而又简明,很容易引起学生的兴趣。)

    (二)、认识表格

    师:拿出自己收集的表格,观察它们有什么共同点?

    生:有横线、竖线、文字。

    师:大家观察得很仔细。(多媒体课件演示)横线我们叫行线、竖线叫列线,它们组成的小方格叫单元格。横向的单元格叫行,竖向的单元格叫列。

    (通过学生观察以及多媒体课件的演示,使学生认识行、列、单元格,为下面制作出正确的表格打下扎实基础)

    (三)、制作表格

    师:在Word中,专门给制作表格功能分了一个菜单,这个“表格”菜单中包含各种关于表格操作的命令,我们可以集中在这个菜单中去完成表格的制作,大家可以打开Word,进入表格菜单中浏览一下,了解关于制表的一些命令。

    (学生打开Word,进入表格菜单浏览。)

    师:我们先插入空白表格,步骤如下:(课件出示步骤)

    1.单击要创建表格的位置。

    2.单击工具栏中的“插入表格”按钮,弹出表格创建模板。

    3.在方格中按住鼠标左键,拖动选择4行4列的方格,被选中区域则变成蓝色。

    4.松开鼠标左键,就绘制出一个4行4列的表格。

    5.如果要改变表格的宽度和高度,则把鼠标移到表格的竖线和横线上,当鼠标变成“‖”和“=”时,按住鼠标左键,拖动鼠标,即可拖动宽度和高度。

    6.在表格中输入学生信息。

    师:下面我们在表格中输入文字,提示输入方法:(课件出示)

    1.在要输入文字的单元格中单击,然后输入文字。

    2.按下键盘上的←、→、↑、↓键,可以移动光标到另一个单元格。

    我想让大家自己先来试按步骤制作这个表格,看大家能不能完成,不懂的可以边做边看教材,同学间也可以互相交流,还可以向老师求教。

    九、课堂练习

    学生按步骤操作。

    教师巡视指导。随机选取代表性错误作讲解。

    (让学生自主探究,并学会遇到问题采用不同的途径来解决)

    生:展示自己的作品,并作简单的演示操作。

    (学生有不同的方法来制作表格,通过演示,不仅使学生的主体地位得到充分的体现,也使学生的创新思维得到了发展)

    (四)、编辑表格

    1.选择表格

    2.增加删除行

    3.删除一行表格。

    教师课件出示,让学生仔细观察,随后让学生自己操作,教师进行辅导,

    (五)、修饰表格

    师:我们制作了一张最普通的表格,我们要把它变成一张漂亮、有个性的表格,你们想吗?

    生:想!

    师:我们先来修饰文字。选择要修饰的文字,给它设置字体、字号、颜色和对齐方式等。

    学生操作,教师巡视指导。遇到问题随机讲解。

    师:我们还可以来设置表格的边框和底纹。

    课件出示步骤:

    1.选择整个表格。

    2.单击鼠标右键,在弹出菜单中选择“单元格对齐方式”,并在其中选择一种。

    3.。单击鼠标右键,在弹出菜单中选择“边框和底纹”。

    4.在边框选项卡上的“设置”中选择一种表格线和边框的样式。

    5.选择线型。

    6.点击“颜色”的下拉按钮,在颜色列表中选择表格线颜色。

    做完上述步骤,一个令人满意的表格就出现在“板报”文档中了。

    学生按步骤进行操作。

    师:我们来展示一下我们的作品,好吗?

    学生的表现欲望很强,让他们有了一个自我展示的空间。

    (六)、保存文件

    师:我们把制作好的表格保存在自己的文件夹里面。

    学生保存。

    (七)、设计活动,深化学习

    师:我们知道,在生活中还有很多地方用到了表格,你能仿照自己收集的某张表格用电脑制作出来吗?

    生:(充满信心)能!

    (把生活中的实际运用纳入课堂,让理论与实践相结合,锻炼学生的实践能力和操作能力。及时鼓励学生,增强他们的自信心。)

    师:保存自己的作品,下课!

    十、作业安排

    仔细观察日常生活中你能见到的所有表格,并挑选出你认为最复杂的一个,把它在word2003中做出来,并在班级内进行评比。评比的标准可考虑表格的复杂程度与原表格的相似程度。

    十一、教学资料及资源

    教学资料:小学信息技术第二册

    资源:多媒体课件,word2003,各种电脑小票,,电话缴费单、课程表、送货单等等

    十二、教学反思

    小学信息技术教学应以信息社会的不断改革创新为基础,通过启发学生的创新思维,建立创新意识。因此,在信息技术教学中,教师必须在充分了解学生现有认知水平、认知能力的基础上,进行教学的拓展和延伸。在教学中,注重学生的实践作用,则能收到较好的教学效果,《插入表格》就是在上述思想指导下设计教学的。

    “兴趣是最好的老师”是学生学习的原动力,是开发智力的催化剂,能激发学生的创造性思维。由于小学生年龄小,好动性、好奇性强,往往坐不住,而对于单调的练习感到厌烦,经过充分考虑、分析学生学习的实际情况,我就适当地采用一些与单调的练习完全不同的方法来激发学生的学习兴趣。配合教材内容,我制作了精美的课件,来激发学生制作表格的兴趣,引起他们修饰表格、美化表格的欲望。同学们在一步步的教学过程中,表现出了极大的兴趣。不会因为太多的困难而中途放弃。步步引导,以此来培养学生的学习兴趣,学生在忘我的学习过程中不知不觉就学会了制作表格。

    在整节课教学中,我采用自学式、探究式、开放式的教学方法,发挥了学生的主观能动性。通过学生的实际,培养了学生的自学探究能力和合作能力,培养了学生的审美情趣和创新精神。通过评价反馈,发展了学生的个性和创造精神。整节课在一种轻松、和谐、民主的气氛中进行,突出了重点,突破了难点,学生的掌握情况良好,达到了预期的教学效果。

    更多相关内容
  • 表格模板-学生成绩报告单.xlsx
  • Html表格

    2021-06-12 04:54:43
    还是先看张图片来刺激一下。源代码超链接演示 仿百度搜索框请输入要搜索的内容:看了上图百度的搜索页面,有木有心动一下,别慌你也能够的。这就是我们今天要讲的表单。什么是Html表单——(可输入控件)表单用于搜集...

    

    在解说今天Html表单之前。还是先看张图片来刺激一下。

    b7ad3f1bf8d422d1c83bcb6ca0946db7.png

    源代码

    超链接演示

    仿百度搜索框

    请输入要搜索的内容:

    看了上图百度的搜索页面,有木有心动一下,别慌你也能够的。这就是我们今天要讲的表单。

    什么是Html表单——(可输入控件)

    表单用于搜集不同类型的用户输入。

    表单的功能

    从訪问您的Web网站的用户那里获得信息。

    訪问者能够使用诸如文本域、列表框、复选框以及单选button之类的表单元素输入信息,然后单机某个button提交这些信息。

    client与server端进行信息交流的途径

    表单的标记

    Form标记用于创建一个表单,定义表单的開始与结束。它是一个容器。用于包括其它表单元素。比如文本框、单选框等。表单元素必须入在form标记内才有作用。

    POST方法能够传递大量信息

    GET方法将值附加到请求该页的URL中,适合传递少量信息(默认方式)

    上面讲述了表单的标记和基本结构。那么以下就该讲述那些可输入控件——表单元素标记

    单行文本框

    0d6e5818219bfa618024971f29d9e4a4.png

    maxlength=”最多容纳字符数” readonly=”readonly”(设置为仅仅读) disabled=”disabled”(设置为不可操作)>

    password框

    eb263a682c53a1892cbc42e5b2a3f64d.png

    --------------------------------------------------------------------------------------------------------------------------------------------------------------

    单选框

    192c7aa1288811d4fc1c37df2ab56932.png

    复选框

    列表框

    菜单式

    列表1

    列表2

    ……

    列表式

    列表1

    …….

    浏览框

    表单外框

    …定义环绕表单中元素的边框

    …legend元素为fieldset元素定义标题

    多行文本框

    button

    name=”button名称” value=”button显示文本”/>

    图片button

    上面就是表单元素的全部标记,有这么多是否是想记住呢?SAY NO。敲个小demo熟悉下就OK了。

    4dbec84ec303bc244552862dc7205d62.png

    源代码

    表单演示

    学生登录系统

    学生姓名:
    password:
    性别:

    个人爱好:

    音乐

    美术

    电影

    交友目的:

    普通朋友

    爱人

    照片上传:
    个人简单介绍:
    城市

    海淀

    朝阳

    东城

    北京

    上海

    天津

    广东

    南京

    小结:

    今天学习了下Html中的表单。说起来起始跟平时学习的编程语言中的控件非常类似,或者能够说就是控件。仅仅只是平时我们都是从工具栏中直接拖进来的。而在HTML中须要自己来创建,没有本质上的差别。

    建立表单后,就開始设计表单标记的一些属性,与编程语言中的设计大相径庭。

    刚開始学习Html的时候,感觉跟Excel特别相似,如今感觉跟编程语言又特相似。须要一些美工的基础,学习有时候就这样,在逐步的认识中逐渐带你进入还有一个“世外桃源”

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

    展开全文
  • 使用 python 自带的 tkinter 库实现基于 mysql 的简单图形化学生信息管理系统,功能有简单的访问控制、账号管理、账号协作、统计计算、数据可视化和数据库数据的导入导出,可以对数据表的内容进行增删改查。...
  • 如何在EXCEL表格中批量插入对应图片.doc
  • 基于python操作表格学生信息管理系统前言一、该项目是基于Tinker所制作的界面二、代码方面1.引入库2.欢迎界面3.主界面的设计菜单栏菜单栏对应的各个子页面总结 前言 Hi!作为一名普通的大学生,我想以此方式来...


    前言

    Hi!作为一名普通的大学生,我想以此方式来记录我学习计算机的过程。
    因此这第一篇博客我想写写我在大一的时候和几个小伙伴所写的一个基于python操作表格的学生信息管理系统(由于过去蛮久时间了,我也不是记得很清除了)。
    这个项目也相当于我们的期末作业,根据老师的要求和格式对所给的数据进行整合,增删改查,以及个人信息的打印和一些扩展效果和功能。
    原始数据样式如下:

    学生成绩表
    学生信息表

    要求是将上述表格的样式合并成如下样式:

    合并后的图表样式


    还有一些细小的要求在过程我会一一讲述。

    一、该项目是基于Tinker所制作的界面

    什么是Tinker?
    这篇文章讲的很好
    链接: Tinker的基础介绍.
    但是在我以后的学习中我发现Tinker的样式已经十分老套了,并且它的美化是不如QT好的(这是我的一些浅薄看法)。
    界面大致样式:
    界面样式

    二、代码方面

    1.引入库

    该项目所分成三个py文件:
    py文件

    该项目所需要的库:
    tkinter,os,time,threading,xlwt,xlrd,xlutils,numpy,pandas,matplotlib,webbrowser
    这些库的内容大家可以自行百度下载

    2.欢迎界面

    这部分内容是我根据网上的一些教程改写的,主要思想就是通过去边框,窗口透明化,设置窗口停留时间等方式来制作一个欢迎界面,样式如下:

    欢迎界面
    代码部分:

    def showWelcome():
        sw = root1.winfo_screenwidth()        # 获取屏幕宽度
        sh = root1.winfo_screenheight()       # 获取屏幕高度r
        root1.overrideredirect(True)          # 去除窗口边框
        root1.attributes("-alpha", 1)         # 窗口透明度(1为不透明,0为全透明)
        x = (sw - 800) / 2
        y = (sh - 450) / 2
        root1.geometry("800x450+%d+%d" % (x, y))      # 将窗口置于屏幕中央
        if os.path.exists(r'9.gif'):                   # 搜索图片文件(只能是gif格式)
            bm = PhotoImage(file=r'9.gif')
            lb_welcomelogo = Label(root1, image=bm)      # 将图片放置于窗口
            lb_welcomelogo.bm = bm
            lb_welcomelogo.place(x=-2, y=-2, )           # 设置图片位置
    
    
    def closeWelcome():
        for i in range(2):
            root.attributes("-alpha", 0)   # 窗口透明度
            time.sleep(1)                  # 屏幕停留时间
        root.attributes("-alpha", 1)       # 窗口透明度
        root1.destroy()                    # 屏幕结束
    
    
    tMain = threading.Thread(target=showWelcome)     # 开始展示
    tMain.start()
    t1 = threading.Thread(target=closeWelcome)       # 结束展示
    t1.start()
    

    对欢迎界面的展示。

    3.主界面的设计

    对于主界面我们简单利用了Tinker的菜单栏这一功能讲增删改查结合起来,主界面在上面也已经展示了。

    菜单栏

    菜单栏

    这里先讲一下菜单栏的相关代码:

    class MainPage(object):
        def __init__(self, master=None):
            self.root = master  # 定义内部变量root
            self.createPage()   # 创建菜单栏
    
        def createPage(self):
            self.inputPage = InputFrame(self.root)  # 创建不同Frame
            self.deletePage = DeleteFrame(self.root)
            self.modifyPage = ModifyFrame(self.root)
            self.queryPage = QueryFrame(self.root)
            self.mergePage = MergeFrame(self.root)
            self.visPage = VisFrame(self.root)
            self.stuPage = StuFrame(self.root)
            self.helpPage = HelpFrame(self.root)
            self.inputPage.pack()                  # 默认显示数据录入界面
            menubar = Menu(self.root)
            menubar.add_command(label='增', command=self.inputData)  # 设置不同菜单栏的名字属性
            menubar.add_command(label='删', command=self.deleteData)
            menubar.add_command(label='改', command=self.modifyData)
            menubar.add_command(label='查', command=self.queryData)
            menubar.add_command(label='合', command=self.mergeData)
            menubar.add_command(label='可视化', command=self.visData)
            menubar.add_command(label='个人信息表', command=self.stuData)
            menubar.add_command(label='帮助', command=self.helpData)
            self.root['menu'] = menubar                             # 设置菜单栏
    
        def inputData(self):                                        # 设置只获取inputData的相关数据
            self.inputPage.pack()
            self.queryPage.pack_forget()
            self.deletePage.pack_forget()
            self.modifyPage.pack_forget()
            self.mergePage.pack_forget()
            self.visPage.pack_forget()
            self.stuPage.pack_forget()
            self.helpPage.pack_forget()
    
        def deleteData(self):                                       # 设置只获取deleteData的相关数据
            self.inputPage.pack_forget()
            self.queryPage.pack_forget()
            self.deletePage.pack()
            self.modifyPage.pack_forget()
            self.mergePage.pack_forget()
            self.visPage.pack_forget()
            self.stuPage.pack_forget()
            self.helpPage.pack_forget()
    
        def modifyData(self):                                       # 设置只获取modifyData的相关数据
            self.inputPage.pack_forget()
            self.queryPage.pack_forget()
            self.deletePage.pack_forget()
            self.modifyPage.pack()
            self.mergePage.pack_forget()
            self.visPage.pack_forget()
            self.stuPage.pack_forget()
            self.helpPage.pack_forget()
    
        def queryData(self):                                        # 设置只获取queryData的相关数据
            self.inputPage.pack_forget()
            self.queryPage.pack()
            self.deletePage.pack_forget()
            self.modifyPage.pack_forget()
            self.mergePage.pack_forget()
            self.visPage.pack_forget()
            self.stuPage.pack_forget()
            self.helpPage.pack_forget()
    
        def mergeData(self):                                          # 设置只获取mergeData的相关数据
            self.inputPage.pack_forget()
            self.queryPage.pack_forget()
            self.deletePage.pack_forget()
            self.modifyPage.pack_forget()
            self.mergePage.pack()
            self.visPage.pack_forget()
            self.stuPage.pack_forget()
            self.helpPage.pack_forget()
    
        def visData(self):                                            # 设置只获取visData的相关数据
            self.inputPage.pack_forget()
            self.queryPage.pack_forget()
            self.deletePage.pack_forget()
            self.modifyPage.pack_forget()
            self.mergePage.pack_forget()
            self.visPage.pack()
            self.stuPage.pack_forget()
            self.helpPage.pack_forget()
    
        def stuData(self):                                           # 设置只获取stuData的相关数据
            self.inputPage.pack_forget()
            self.queryPage.pack_forget()
            self.deletePage.pack_forget()
            self.modifyPage.pack_forget()
            self.mergePage.pack_forget()
            self.visPage.pack_forget()
            self.stuPage.pack()
            self.helpPage.pack_forget()
    
        def helpData(self):                                          # 设置只获取helpData的相关数据
            self.inputPage.pack_forget()
            self.queryPage.pack_forget()
            self.deletePage.pack_forget()
            self.modifyPage.pack_forget()
            self.mergePage.pack_forget()
            self.visPage.pack_forget()
            self.stuPage.pack_forget()
            self.helpPage.pack()
    

    这一部分内容我也是根据网络上一些大佬的内容进行改写的,但是时间久远已经忘了出处了(侵删)。

    时间戳

    在界面上我也设置了一个全局变量——时间戳(可以实时的获取屏幕时间显示在我们的主界面上):
    时间戳
    代码如下:

    def gettime():
        timestr = time.strftime("%H:%M:%S")     # 获取当前时间并转换为字符串
        lb.configure(text=timestr)              # 重新设置标签文本
        root.after(1000, gettime)               # 获取时间
    

    4.增加学生信息界面

    增加学生信息界面

    代码如下:

    class InputFrame(Frame):  # 继承Frame类
        def __init__(self, master=None):
            Frame.__init__(self, master)
            self.root = master  # 定义内部变量root
            self.E1 = Entry(self)  # 设置得到输入的内容
            self.E2 = Entry(self)
            self.E3 = Entry(self)
            self.E4 = Entry(self)
            self.E5 = Entry(self)
            self.E6 = Entry(self)
            self.E7 = Entry(self)
            self.E8 = Entry(self)
            self.E9 = Entry(self)
            self.E10 = Entry(self)
            self.E11 = Entry(self)
            self.E12 = Entry(self)
            self.E13 = Entry(self)
            self.E14 = Entry(self)
            self.createPage()
    
        def Isspace(self, text):
            temp = 0                           # 检索text中的内容是否为空,如果是赋值为1
            for i in text:
                if not i.isspace():
                    temp = 1
                    break
            if temp == 1:
                return 0
            else:
                return 1
    
        def write(self, num, name, major, calss, score1,score2,score3,score4,score5,score6,score7,score8,score9,score10):
            workbook = xlrd.open_workbook("学生信息成绩表.xls")                                         # 打开表格
            data = xlrd.open_workbook('学生信息成绩表.xls', formatting_info=True)
            sheet = workbook.sheet_by_index(0)                                                         # 获取表格所需要的页
            my_dict = dict()                                                                           # 定义一个字典
            for i in range(2, sheet.nrows):                                                            # 通过循环遍历从第三行行到结束
                my_dict_key = sheet.cell_value(i, 1)                                                   # 定义每行第二列的数据为字典的key值
                my_dict_value = sheet.cell_value(i, 2)                                                 # 定义每行第三列的数据为字典的value
                my_dict[my_dict_key] = my_dict_value                                                   # 定义key,和value
            my_dict = list(map(int, my_dict))                                                          # 将字典里的数据转化为整形
            excel = copy(wb=data)                                                                      # 完成xlrd对象向xlwt对象转换
            excel_table = excel.get_sheet(0)
            values = (num, name, major, calss, score1, score2, score3, score4, score5, score6, score7, score8, score9, score10)
            i = 0
            leap = 0
            for temp in my_dict:                                     # 循环遍历字典
                if temp == int(num):                                 # 如果循环到的数据等于输入的学号
                    leap = 1
                    break
                else:
                    i = i + 1
            while leap == 1:                                         # 如果leap = 1那么就输出不存在该学生信息
                messagebox.showinfo(title='结果', message="已存在该学生科目信息!")
                break
            else:
                ncols = 1
                for value in values:                                # 循环遍历输入的数据
                   excel_table.write(sheet.nrows, ncols, value, set_style('Courier New', 20 * 9, 0x01, 42, 48))          # 循环遍历写入表格,并设置格式
                   ncols = ncols + 1                                # 行数加一
                messagebox.showinfo(title='提示', message="写入成功")
                excel_table.write(sheet.nrows, 0, sheet.nrows - 1, set_style('Courier New', 20 * 9, 0x01, 42, 48))       # 写入序号
            excel.save('学生信息成绩表.xls')                         # 保存表格
            return
    
        def click(self):
            num = self.E1.get()                                          # 得到输入的数据
            name = self.E2.get()
            major = self.E3.get()
            calss = self.E4.get()
            score1 = self.E5.get()
            score2 = self.E6.get()
            score3 = self.E7.get()
            score4 = self.E8.get()
            score5 = self.E9.get()
            score6 = self.E10.get()
            score7 = self.E11.get()
            score8 = self.E12.get()
            score9 = self.E13.get()
            score10 = self.E14.get()
            if self.Isspace(num) or self.Isspace(name) or self.Isspace(major) or self.Isspace(calss):    # 判断输入的学号,名字,班级专业是否为空
                messagebox.showinfo(title='提示', message="输入项为空")
            else:                                                             # 如果不是,则写入输入的数据
                self.write(num, name, major, calss, score1, score2, score3, score4, score5, score6, score7, score8, score9, score10)
    
        def createPage(self):           # 设置文本和文本框,以及按钮组件
            Label(self).grid(row=0, stick=W, pady=10)
            Label(self, text='学号:', font=("华文彩云")).grid(column=0, row=1, stick=W, pady=10)
            self.E1.grid(row=1, column=1, stick=E)
            Label(self, text='姓名:', font=("华文彩云")).grid(column=3, row=1, stick=W, pady=10)
            self.E2.grid(row=1, column=4, stick=E)
            Label(self, text='专业:', font=("华文彩云")).grid(row=3, stick=W, pady=10)
            self.E3.grid(row=3, column=1, stick=E)
            Label(self, text='班级:', font=("华文彩云")).grid(column=3, row=3, stick=W, pady=10)
            self.E4.grid(row=3, column=4, stick=E)
            Label(self, text='高级程序语言:', font=("华文彩云")).grid(row=6, stick=W, pady=10)
            self.E5.grid(row=6, column=1, stick=E)
            Label(self, text='python编程:', font=("华文彩云")).grid(column=3, row=6, stick=W, pady=10)
            self.E6.grid(row=6, column=4, stick=E)
            Label(self, text='数据库原理:', font=("华文彩云")).grid(row=7, stick=W, pady=10)
            self.E7.grid(row=7, column=1, stick=E)
            Label(self, text='数据结构与算法:', font=("华文彩云")).grid(column=3, row=7, stick=W, pady=10)
            self.E8.grid(row=7, column=4, stick=E)
            Label(self, text='数学分析:', font=("华文彩云")).grid(row=9, stick=W, pady=10)
            self.E9.grid(row=9, column=1, stick=E)
            Label(self, text='高等数学:', font=("华文彩云"), fg="black").grid(column=3, row=9, stick=W, pady=10)
            self.E10.grid(row=9, column=4, stick=E)
            Label(self, text='网络爬虫:', font=("华文彩云")).grid(row=11, stick=W, pady=10)
            self.E11.grid(row=11, column=1, stick=E)
            Label(self, text='数据可视化:', font=("华文彩云")).grid(column=3, row=11, stick=W, pady=10)
            self.E12.grid(row=11, column=4, stick=E)
            Label(self, text='数据挖掘:', font=("华文彩云")).grid(row=13, stick=W, pady=10)
            self.E13.grid(row=13, column=1, stick=E)
            Label(self, text='数据分析:', font=("华文彩云")).grid(column=3, row=13, stick=W, pady=10)
            self.E14.grid(row=13, column=4, stick=E)
            Label(self, text='增加学生信息', font=("华文彩云")).grid(row=0, column=2, stick=N, pady=10)
            Label(self, text='各科成绩', font=("华文彩云")).grid(row=5, column=2, stick=N, pady=10)
            action = ttk.Button(self, text="录入", command=self.click)
            action.grid(row=15, column=4, stick=E, pady=10)
    

    主要通过继承Frame类,通过设置文本和文本框,以及按钮组件,将所接收到的数据写入到表格中(代码注释还是比较详细的)。

    5.删除学生信息界面

    删除学生信息
    这里通过获取学生的学号利用下拉框选项删除学生指定的科目或者全部科目成绩。
    代码如下:

    class DeleteFrame(Frame):  # 继承Frame类
        def __init__(self, master=None):
            Frame.__init__(self, master)
            self.root = master  # 定义内部变量root
            self.E1 = Entry(self)              # 定义输入数据
            self.E2 = Entry(self)
            self.createPage()
    
        def Isspace(self, text):               # 检索text中的内容是否为空,如果是赋值为1
            temp = 0
            for i in text:
                if not i.isspace():
                    temp = 1
                    break
    
            if temp == 1:
                return 0
            else:
                return 1
    
        def click(self):
            df = pd.read_excel('学生信息成绩表.xls')  # 读取Excel表
            df.dropna(how='all', inplace=True)    # 过滤缺失数据,删除全为空值(NaN)的一行并在原表上进行修改
            df.to_excel('学生信息成绩表.xls', sheet_name='Sheet1', index=False, encoding='UTF-8')   # 保存,设置格式
            workbook1 = xlrd.open_workbook('学生信息成绩表.xls')
            # 获取表格信息
            sheet1 = workbook1.sheet_by_name(workbook1.sheet_names()[0])
            rows1 = sheet1.nrows
            cols1 = sheet1.ncols
            workbook = xlwt.Workbook(encoding="UTF-8")
            sheets = workbook.add_sheet("Sheet1")
            # 设置列宽
            sheets.col(0).width = 256 * 5
            sheets.col(1).width = 256 * 18
            sheets.col(2).width = 256 * 18
            for i in range(3, 15):
                sheets.col(i).width = 256 * 14
            # 设置行高
            sheets.row(0).height_mismatch = True  # 允许设置行高
            sheets.row(0).height = 20 * 21
            for i in range(1, rows1):
                sheets.row(i).height_mismatch = True
                sheets.row(i).height = 20 * 15
    
            def set_styles(name, height, borders, colour, colour_index):  # 设置样式
                styles = xlwt.XFStyle()
                styles.font = xlwt.Font()
                styles.font.name = name  # 设置字体
                styles.font.height = height  # 设置字体大小
                styles.font.colour_index = colour_index  # 设置字体颜色
                styles.borders = xlwt.Borders()
                # 设置边框
                styles.borders.left = borders
                styles.borders.top = borders
                styles.borders.right = borders
                styles.borders.bottom = borders
                # 设置背景
                styles.pattern = xlwt.Pattern()
                styles.pattern.pattern = True  # 允许设置背景
                # style.pattern.pattern_back_colour = 0x04    # 后背景颜色
                styles.pattern.pattern_fore_colour = colour  # 前背景颜色
                # 设置表格对齐属性
                styles.alignment = xlwt.Alignment()
                styles.alignment.horz = xlwt.Alignment.HORZ_CENTER  # 水平对齐
                styles.alignment.wrap = xlwt.Alignment.NOT_WRAP_AT_RIGHT  # 自动换行
                styles.alignment.vert = xlwt.Alignment.VERT_CENTER  # 垂直对齐
                return styles
    
            sheets.write_merge(0, 0, 0, 13, '学生信息成绩表', set_styles('黑体', 20 * 16, 0x01, 41, 6))  # 合并单元格写入内容,设置样式
            for i in range(1, rows1):          # 获取行的内容
                for j in range(0, cols1):      # 获取列的内容
                    sheets.write(i, j, sheet1.row_values(i)[j], set_styles('Courier New', 20 * 9, 0x01, 42, 48))   # 向指定行列写入信息
    
            workbook.save("学生信息成绩表.xls")  # 保存
            num = self.E1.get()
            course = self.boxChoice.get()
            if self.Isspace(num) or self.Isspace(course):                      # 如果输入的值为空,就提示输入为空
                messagebox.showinfo(title='提示', message="输入项为空")
            else:
                wb = xlrd.open_workbook("学生信息成绩表.xls", formatting_info=True)        # 打开表格,并保持表格格式不变
                sheet = wb.sheet_by_index(0)                                   # 获取表页
                dic = {}                                                       # 定义一个空字典
                for i in range(2, sheet.nrows):                                # 循环表里第三行到最后一行
                    lis = []                                                   # 定义一个列表
                    for j in range(1, sheet.ncols):                            # 循环遍历从第一列到最后一列的数据
                        lis.append(sheet.cell(i, j).value)                     # 再将每行每列的数据放入列表中
                    dic[sheet.cell(i, 1).value] = lis                          # 将第一列的数据定义为列表的key值
                my_dic = list(map(int, list(dic.keys())))                      # 将字典的值转化为整形
                sum = 0
                temp = 0
                a = 0
                new_wb = copy(wb)                                              # 将原有的Excel,拷贝一个新的副本
                new_sheet = new_wb.get_sheet(0)
                for i in my_dic:                                               # 遍历循环字典里的值
                    a = a + 1
                    if i == int(num):                                          # 判定指定属性,确定删除行
                        if course == "全部":
                            sum += 1
                            dic.pop(str(num))                                  # 删除输入学号的一行
                            m = 0
                            for i in list(dic.keys()):                         # 循环遍历字典中的key值
                                m += 1
                                n = 1
                                for j in dic[i]:                               # 循环遍历字典中的value
                                    new_sheet.write(m+1, n, j, set_style('Courier New', 20 * 9, 0x01, 42, 48))    # 将遍历的值以一种格式输入到表格
                                    n += 1
                            for h in range(m + 1, m + 1 + sum):          # 循环遍历
                                m += 1
                                n = 1
                                for k in dic[i]:
                                    new_sheet.write(m+1, n, '', set_style('Courier New', 20 * 9, 0x01, 42, 48))        # 将空白的值填入以覆盖之前被删除的值
                                    n += 1
                            new_sheet.write(sheet.nrows - 1, 0, '', set_style('Courier New', 20 * 9, 0x01, 42, 48))     # 最后一行的序号值填入空
                            temp = 1
                            break
                        elif course == "高级程序语言":
                            if sheet.cell_value(a+1, 5) == '':                          # 判断是否为空值
                                messagebox.showinfo(title='提示', message="该科目成绩不存在!")
                                temp = 2
                                break
                            else:
                                temp = 1
                                new_sheet.write(a+1, 5, '—', set_style('Courier New', 20 * 9, 0x01, 42, 48))    # 如果不是就给予一个空值
                        elif course == "python编程":
                            if sheet.cell_value(a+1, 6) == '':
                                messagebox.showinfo(title='提示', message="该科目成绩不存在!")
                                temp = 2
                                break
                            else:
                                temp = 1
                                new_sheet.write(a+1, 6, '—', set_style('Courier New', 20 * 9, 0x01, 42, 48))
                        elif course == "数据库原理":
                            if sheet.cell_value(a+1, 7) == '':
                                messagebox.showinfo(title='提示', message="该科目成绩不存在!")
                                temp = 2
                                break
                            else:
                                temp = 1
                                new_sheet.write(a+1, 7, '—', set_style('Courier New', 20 * 9, 0x01, 42, 48))
                        elif course == "数据结构与算法":
                            if sheet.cell_value(a+1, 8) == '':
                                messagebox.showinfo(title='提示', message="该科目成绩不存在!")
                                temp = 2
                                break
                            else:
                                temp = 1
                                new_sheet.write(a+1, 8, '—', set_style('Courier New', 20 * 9, 0x01, 42, 48))
                        elif course == "数学分析":
                            if sheet.cell_value(a+1, 9) == '':
                                messagebox.showinfo(title='提示', message="该科目成绩不存在!")
                                temp = 2
                                break
                            else:
                                temp = 1
                                new_sheet.write(a+1, 9, '—', set_style('Courier New', 20 * 9, 0x01, 42, 48))
                        elif course == "高等数学":
                            if sheet.cell_value(a+1, 10) == '':
                                messagebox.showinfo(title='提示', message="该科目成绩不存在!")
                                temp = 2
                                break
                            else:
                                temp = 1
                                new_sheet.write(a+1, 10, '—', set_style('Courier New', 20 * 9, 0x01, 42, 48))
                        elif course == "网络爬虫":
                            if sheet.cell_value(a+1, 11) == '':
                                messagebox.showinfo(title='提示', message="该科目成绩不存在!")
                                temp = 2
                                break
                            else:
                                temp = 1
                                new_sheet.write(a+1, 11, '—', set_style('Courier New', 20 * 9, 0x01, 42, 48))
                        elif course == "数据可视化":
                            if sheet.cell_value(a+1, 12) == '':
                                messagebox.showinfo(title='提示', message="该科目成绩不存在!")
                                temp = 2
                                break
                            else:
                                temp = 1
                                new_sheet.write(a+1, 12, '—', set_style('Courier New', 20 * 9, 0x01, 42, 48))
                        elif course == "数据挖掘":
                            if sheet.cell_value(a+1, 13) == '':
                                messagebox.showinfo(title='提示', message="该科目成绩不存在!")
                                temp = 2
                                break
                            else:
                                temp = 1
                                new_sheet.write(a+1, 13, '—', set_style('Courier New', 20 * 9, 0x01, 42, 48))
                        elif course == "数据分析":
                            if sheet.cell_value(a+1, 14) == '':
                                messagebox.showinfo(title='提示', message="该科目成绩不存在!")
                                temp = 2
                                break
                            else:
                                temp = 1
                                new_sheet.write(a+1, 14, '—', set_style('Courier New', 20 * 9, 0x01, 42, 48))
                            break
                if temp == 1:                                                    # 判断temp的值
                  messagebox.showinfo(title='提示', message="删除成功!")
                elif temp == 0:
                  messagebox.showinfo(title='提示', message="不存在该学生信息!")
                new_wb.save("学生信息成绩表.xls")                                 # 保存表格
    
        def createPage(self):                                                   # 编辑文本,按钮,文本框
            Label(self).grid(row=0, stick=W, pady=10)
            Label(self, text='删除学生信息', font=("华文彩云")).grid(row=0, column=1, stick=N, pady=10)
            Label(self, text='学号: ', font=("华文彩云")).grid(row=1, stick=W, pady=10)
            self.E1.grid(row=1, column=1, stick=E)
            Label(self, text='科目: ', font=("华文彩云")).grid(row=2, stick=W, pady=10)
            sexBoxValue = StringVar()
            self.boxChoice = ttk.Combobox(self, width=17, textvariable=sexBoxValue, state='readonly')
            self.boxChoice['value'] = ("高级程序语言", "python编程", "数据库原理", "数据结构与算法", "数学分析", "高等数学", "网络爬虫", "数据可视化", "数据挖掘", "数据分析", "全部")
            self.boxChoice.current(0)
            self.boxChoice.grid(row=2, column=1, sticky=E)
            action = ttk.Button(self, text="删除", command=self.click)
            action.grid(row=6, column=1, stick=E, pady=10)
    

    这部分内容其实与增加学生信息大相径庭,通过ttk.Combobox进行下拉选项框的设置,利用循环遍历等方式对表格进行删除(代码注释比较详细了)。

    6.修改学生信息界面

    修改学生信息修改学生的信息,其中学号是必填项,可以选择所有的成绩都修改,也可以选择只是修改一部分成绩。
    代码如下:

    class ModifyFrame(Frame):                      # 继承Frame类
        def __init__(self, master=None):
            Frame.__init__(self, master)
            self.root = master                     # 定义内部变量root
            self.E1 = Entry(self)
            self.E2 = Entry(self)
            self.E3 = Entry(self)
            self.E4 = Entry(self)
            self.E5 = Entry(self)
            self.E6 = Entry(self)
            self.E7 = Entry(self)
            self.E8 = Entry(self)
            self.E9 = Entry(self)
            self.E10 = Entry(self)
            self.E11 = Entry(self)
            self.E12 = Entry(self)
            self.E13 = Entry(self)
            self.E14 = Entry(self)
            self.createPage()
    
        def Isspace(self, text):                 # 检索text中的内容是否为空,如果是赋值为1
            temp = 0
            for i in text:
                if not i.isspace():
                    temp = 1
                    break
    
            if temp == 1:
                return 0
            else:
                return 1
    
        def modify(self, num, name, major, calss, score1, score2, score3, score4, score5, score6, score7, score8, score9, score10):
            workbook = xlrd.open_workbook("学生信息成绩表.xls")                 # 打开表格
            data = xlrd.open_workbook('学生信息成绩表.xls', formatting_info=True)
            sheet = workbook.sheet_by_index(0)
            my_dict = dict()                                                   # 创建一个字典
            for i in range(2, sheet.nrows):
                my_dict_key = sheet.cell_value(i, 1)
                my_dict_value = sheet.cell_value(i, 2)
                my_dict[my_dict_key] = my_dict_value
            my_dict = list(map(int, my_dict))
            excel = copy(wb=data)                                              # 完成xlrd对象向xlwt对象转换
            excel_table = excel.get_sheet(0)
            dic = {}
            for i in range(2, sheet.nrows):                                   # 循环遍历每一行的内容
                lis = []                                                      # 创建一个新的列表
                for j in range(1, sheet.ncols):
                    lis.append(sheet.cell(i, j).value)
                dic[sheet.cell(i, 1).value] = lis
            i = 0
            leap = 0
            a = 0
            for temp in my_dict:                                            # 循环遍历字典里的数据
                a = a + 1
                if temp == int(num):                                        # 判断输入的学号
                    leap = 1
                    if num != '':                                           # 是否为空
                        dic[num][0] = num                                   # 不是则将输入的学号赋给它
                    if name != '':
                        dic[str(num)][1] = name
                    if major != '':
                        dic[str(num)][2] = major
                    if calss != '':
                        dic[str(num)][3] = calss
                    if score1 != '':
                        dic[str(num)][4] = score1
                    if score2 != '':
                        dic[str(num)][5] = score2
                    if score3 != '':
                        dic[str(num)][6] = score3
                    if score4 != '':
                        dic[str(num)][7] = score4
                    if score5 != '':
                        dic[str(num)][8] = score5
                    if score6 != '':
                        dic[str(num)][9] = score6
                    if score7 != '':
                        dic[str(num)][10] = score7
                    if score8 != '':
                        dic[str(num)][11] = score8
                    if score9 != '':
                        dic[str(num)][12] = score9
                    if score10 != '':
                        dic[str(num)][13] = score10
                    break
                else:
                    i = i + 1
            while leap == 1:
                ncols = 1
                for value in dic[str(num)]:                # 循环遍历字典中的值
                    excel_table.write(a+1, ncols, value, set_style('Courier New', 20 * 9, 0x01, 42, 48))    # 将遍历的值依次写入
                    ncols = ncols + 1
                messagebox.showinfo(title='提示', message="修改成功")
                break
            else:
                messagebox.showinfo(title='结果', message="不存在该学生信息!")
            excel.save('学生信息成绩表.xls')
            return
    
        def click(self):
            num = self.E1.get()                      # 得到输入的数据
            name = self.E2.get()
            major = self.E3.get()
            calss = self.E4.get()
            score1 = self.E5.get()
            score2 = self.E6.get()
            score3 = self.E7.get()
            score4 = self.E8.get()
            score5 = self.E9.get()
            score6 = self.E10.get()
            score7 = self.E11.get()
            score8 = self.E12.get()
            score9 = self.E13.get()
            score10 = self.E14.get()
            if self.Isspace(name) or self.Isspace(num) or self.Isspace(major) or self.Isspace(calss):             # 判断是否输入的数据是否为空
                messagebox.showinfo(title='提示', message="输入项为空")
            else:
                self.modify(num, name, major, calss, score1, score2, score3, score4, score5, score6, score7, score8, score9, score10)            # 如果不是就将输入的值进行指定的操作
    
        def createPage(self):                                            # 设置文本,文本框和按钮组件
            Label(self).grid(row=0, stick=W, pady=10)
            Label(self, text='学号:', font=("华文彩云")).grid(column=0, row=1, stick=W, pady=10)
            self.E1.grid(row=1, column=1, stick=E)
            Label(self, text='姓名:', font=("华文彩云")).grid(column=3, row=1, stick=W, pady=10)
            self.E2.grid(row=1, column=4, stick=E)
            Label(self, text='专业:', font=("华文彩云")).grid(row=3, stick=W, pady=10)
            self.E3.grid(row=3, column=1, stick=E)
            Label(self, text='班级:', font=("华文彩云")).grid(column=3, row=3, stick=W, pady=10)
            self.E4.grid(row=3, column=4, stick=E)
            Label(self, text='高级程序语言:', font=("华文彩云")).grid(row=6, stick=W, pady=10)
            self.E5.grid(row=6, column=1, stick=E)
            Label(self, text='python编程:', font=("华文彩云")).grid(column=3, row=6, stick=W, pady=10)
            self.E6.grid(row=6, column=4, stick=E)
            Label(self, text='数据库原理:', font=("华文彩云")).grid(row=7, stick=W, pady=10)
            self.E7.grid(row=7, column=1, stick=E)
            Label(self, text='数据结构与算法:', font=("华文彩云")).grid(column=3, row=7, stick=W, pady=10)
            self.E8.grid(row=7, column=4, stick=E)
            Label(self, text='数学分析:', font=("华文彩云")).grid(row=9, stick=W, pady=10)
            self.E9.grid(row=9, column=1, stick=E)
            Label(self, text='高等数学:', font=("华文彩云")).grid(column=3, row=9, stick=W, pady=10)
            self.E10.grid(row=9, column=4, stick=E)
            Label(self, text='网络爬虫:', font=("华文彩云")).grid(row=11, stick=W, pady=10)
            self.E11.grid(row=11, column=1, stick=E)
            Label(self, text='数据可视化:', font=("华文彩云")).grid(column=3, row=11, stick=W, pady=10)
            self.E12.grid(row=11, column=4, stick=E)
            Label(self, text='数据挖掘:', font=("华文彩云")).grid(row=13, stick=W, pady=10)
            self.E13.grid(row=13, column=1, stick=E)
            Label(self, text='数据分析:', font=("华文彩云")).grid(column=3, row=13, stick=W, pady=10)
            self.E14.grid(row=13, column=4, stick=E)
            Label(self, text='修改学生信息', font=("华文彩云")).grid(row=0, column=2, stick=N, pady=10)
            Label(self, text='各科成绩', font=("华文彩云")).grid(row=5, column=2, stick=N, pady=10)
            action = ttk.Button(self, text="修改", command=self.click)
            action.grid(row=15, column=4, stick=E, pady=10)
    

    对原先表格中的数值进行修改重新覆盖原来的信息(代码注释详细)。

    7.查询学生信息界面

    查询个人成绩
    通过学号查询学生的个人成绩,可以选择查询单科的成绩也可以选择查询全部的成绩。
    代码如下:

    class QueryFrame(Frame):                       # 继承Frame类
        def __init__(self, master=None):
            Frame.__init__(self, master)
            self.root = master                     # 定义内部变量root
            self.E1 = Entry(self)
            self.E2 = Entry(self)
            self.boxChoice = Entry(self)
            self.createPage()
    
        def Isspace(self, text):                  # 同上
            temp = 0
            for i in text:
                if not i.isspace():
                    temp = 1
                    break
    
            if temp == 1:
                return 0
            else:
                return 1
    
        def query(self, num, course):
            workbook = xlrd.open_workbook("学生信息成绩表.xls")
            data = xlrd.open_workbook('学生信息成绩表.xls', formatting_info=True)
            sheet = workbook.sheet_by_index(0)
            my_dict = dict()
            for i in range(2, sheet.nrows):
                my_dict_key = sheet.cell_value(i, 1)
                my_dict_value = sheet.cell_value(i, 2)
                my_dict[my_dict_key] = my_dict_value
            my_dict = list(map(int, my_dict))
            excel = copy(wb=data)  # 完成xlrd对象向xlwt对象转换
            i = 0
            a = 0
            leap = 0
            for temp in my_dict:                    # 循环遍历字典中的值
                a = a + 1                           # 每次循环a的值都加一,来获取表格的行数
                if temp == int(num):                # 判断数据是否为输入的值
                   leap = 1
                   if course == "全部":              # 判断是否为全部
                      messagebox.showinfo(title='提示',               # 输出所获取的数据
                                          message="学号:" + sheet.cell_value(a + 1, 1) + "\n姓名:" + sheet.cell_value(a + 1,
                                                                                                                  2) + "\n专业:" + sheet.cell_value(
                                              a + 1, 3) + "\n班级:" + sheet.cell_value(a + 1,
                                                                                     4) + "\n高级程序语言:" + sheet.cell_value(
                                              a + 1, 5) + "\npython编程:" + sheet.cell_value(a + 1,
                                                                                           6) + "\n数据库原理:" + sheet.cell_value(
                                              a + 1, 7) + "\n数据结构与算法:" + sheet.cell_value(a + 1,
                                                                                          8) + "\n数学分析:" + sheet.cell_value(
                                              a + 1, 9) + "\n高等数学:" + sheet.cell_value(a + 1,
                                                                                       10) + "\n网络爬虫:" + sheet.cell_value(
                                              a + 1, 11) + "\n数据可视化:" + sheet.cell_value(a + 1,
                                                                                         12) + "\n数据挖掘:" + sheet.cell_value(a + 1, 13) + "\n数据分析:" + sheet.cell_value(a + 1, 14))
                   elif course =="高级程序语言":          # 单独检索成绩
                      messagebox.showinfo(title='提示',message="学号:" + sheet.cell_value(a + 1, 1) + "\n姓名:" + sheet.cell_value(a + 1, 2)+ "\n专业:" + sheet.cell_value(a+1, 3) + "\n班级:" + sheet.cell_value(a+1, 4)+"\n高级程序语言:" + sheet.cell_value(a+1, 5))
                   elif course == "python编程":
                      messagebox.showinfo(title='提示',message="学号:" + sheet.cell_value(a + 1, 1) + "\n姓名:" + sheet.cell_value(a + 1, 2)+ "\n专业:" + sheet.cell_value(a+1, 3) + "\n班级:" + sheet.cell_value(a+1, 4)+"\npython编程:" + sheet.cell_value(a+1, 5))
                   elif course == "数据库原理":
                      messagebox.showinfo(title='提示',message="学号:" + sheet.cell_value(a + 1, 1) + "\n姓名:" + sheet.cell_value(a + 1, 2)+ "\n专业:" + sheet.cell_value(a+1, 3) + "\n班级:" + sheet.cell_value(a+1, 4)+"\n数据库原理:" + sheet.cell_value(a+1, 5))
                   elif course == "数据结构与算法":
                      messagebox.showinfo(title='提示',message="学号:" + sheet.cell_value(a + 1, 1) + "\n姓名:" + sheet.cell_value(a + 1, 2) +"\n专业:" + sheet.cell_value(a+1, 3) + "\n班级:" + sheet.cell_value(a+1, 4)+"\n数据结构与算法:" + sheet.cell_value(a+1, 5))
                   elif course == "数学分析":
                      messagebox.showinfo(title='提示',message="学号:" + sheet.cell_value(a + 1, 1) + "\n姓名:" + sheet.cell_value(a + 1, 2) +"\n专业:" + sheet.cell_value(a+1, 3) + "\n班级:" + sheet.cell_value(a+1, 4)+"\n数学分析:" + sheet.cell_value(a+1, 5))
                   elif course == "高等数学":
                      messagebox.showinfo(title='提示',message="学号:" + sheet.cell_value(a + 1, 1) + "\n姓名:" + sheet.cell_value(a + 1, 2)+"\n专业:" + sheet.cell_value(a+1, 3) + "\n班级:" + sheet.cell_value(a+1, 4)+"\n高等数学:" + sheet.cell_value(a+1, 5))
                   elif course == "网络爬虫":
                      messagebox.showinfo(title='提示',message="学号:" + sheet.cell_value(a + 1, 1) + "\n姓名:" + sheet.cell_value(a + 1, 2) +"\n专业:" + sheet.cell_value(a+1, 3) + "\n班级:" + sheet.cell_value(a+1, 4)+"\n网络爬虫:" + sheet.cell_value(a+1, 5))
                   elif course == "数据可视化":
                      messagebox.showinfo(title='提示',message="学号:" + sheet.cell_value(a + 1, 1) + "\n姓名:" + sheet.cell_value(a + 1, 2)+"\n专业:" + sheet.cell_value(a+1, 3) + "\n班级:" + sheet.cell_value(a+1, 4)+"\n数据可视化:" + sheet.cell_value(a+1, 5))
                   elif course == "数据挖掘":
                      messagebox.showinfo(title='提示',message="学号:" + sheet.cell_value(a + 1, 1) + "\n姓名:" + sheet.cell_value(a + 1, 2) +"\n专业:" + sheet.cell_value(a+1, 3) + "\n班级:" + sheet.cell_value(a+1, 4)+"\n数据挖掘:" + sheet.cell_value(a+1, 5))
                   elif course == "数据分析":
                      messagebox.showinfo(title='提示', message="学号:" + sheet.cell_value(a + 1, 1) + "\n姓名:" + sheet.cell_value(a + 1, 2) +"\n专业:" + sheet.cell_value(a+1, 3) + "\n班级:" + sheet.cell_value(a+1, 4)+"\n数据分析:" + sheet.cell_value(a+1, 5))
                      break
                else:
                    i = i +1
            while leap == 0:
              messagebox.showinfo(title='提示', message="不存在该学生信息")
              break
            excel.save('学生信息成绩表.xls')
            return
    
        def createPage(self):                # 设置文本,文本框和按钮组件
            Label(self).grid(row=0, stick=W, pady=10)
            Label(self, text='查询个人成绩', font=("华文彩云")).grid(row=0, column=1, stick=N, pady=10)
            Label(self, text='学号: ', font=("华文彩云")).grid(row=1, stick=W, pady=10)
            self.E1.grid(row=1, column=1, stick=E)
            Label(self, text='科目: ', font=("华文彩云")).grid(row=2, stick=W, pady=10)
            sexBoxValue = StringVar()
            self.boxChoice = ttk.Combobox(self, width=17, textvariable=sexBoxValue, state='readonly')
            self.boxChoice['value'] = ("高级程序语言", "python编程", "数据库原理", "数据结构与算法", "数学分析", "高等数学", "网络爬虫", "数据可视化", "数据挖掘", "数据分析", "全部")
            self.boxChoice.current(0)
            self.boxChoice.grid(row=2, column=1, sticky=E)
            action = ttk.Button(self, text="查询", command=self.click)
            action.grid(row=6, column=1, stick=E, pady=10)
    
        def click(self):
            num = self.E1.get()
            course = self.boxChoice.get()
            if self.Isspace(num) or self.Isspace(course):             # 判断是否为空
                messagebox.showinfo(title='提示', message="输入项为空")
            else:
                self.query(num, course)                # 执行操作
    

    通过获取到的学号和科目名称等,通过循环遍历查找到表格中对应的信息,并将其显示出来,相关内容也是大相径庭,具体内容在注释中解释比较详细了。

    8.表格信息的合并

    该内容是针对前言中老师所要求的表格的合并,将两张表格内容合并成一张表。
    代码如下:

    class MergeFrame(Frame):
        def __init__(self, master=None):
            Frame.__init__(self, master)
            self.createPage()
    
        def doProcess(self):                               # 设置表格样式
            workbook1 = xlrd.open_workbook('学生信息表.xlsx')   # 打开Excel表
            workbook2 = xlrd.open_workbook('学生成绩表.xlsx')
    
            sheet1 = workbook1.sheet_by_name(workbook1.sheet_names()[0])   # 获取工作表
            rows1 = sheet1.nrows  # 获取行
            cols1 = sheet1.ncols  # 获取列
    
            sheet2 = workbook2.sheet_by_name(workbook2.sheet_names()[0])
            rows2 = sheet2.nrows
            cols2 = sheet2.ncols
    
            workbook = xlwt.Workbook(encoding="UTF-8")   # 设置新表
            sheets = workbook.add_sheet("Sheet1")
    
            # 设置列宽
            sheets.col(0).width = 256 * 5
            sheets.col(1).width = 256 * 18
            sheets.col(2).width = 256 * 18
            for i in range(3, 15):
                sheets.col(i).width = 256 * 14
    
            # 设置行高
            sheets.row(0).height_mismatch = True  # 允许设置行高
            sheets.row(0).height = 20 * 21
            for i in range(1, rows2):
                sheets.row(i).height_mismatch = True
                sheets.row(i).height = 20 * 15
    
            def set_styles(name, height, borders, colour, colour_index):   # 设置样式
                styles = xlwt.XFStyle()
                styles.font = xlwt.Font()
                styles.font.name = name  # 设置字体
                styles.font.height = height  # 设置字体大小
                styles.font.colour_index = colour_index  # 设置字体颜色
                styles.borders = xlwt.Borders()
                # 设置边框
                styles.borders.left = borders
                styles.borders.top = borders
                styles.borders.right = borders
                styles.borders.bottom = borders
                # 设置背景
                styles.pattern = xlwt.Pattern()
                styles.pattern.pattern = True  # 允许设置背景
                # styles.pattern.pattern_back_colour = 0x04    # 后背景颜色
                styles.pattern.pattern_fore_colour = colour  # 前背景颜色
                # 设置表格对齐属性
                styles.alignment = xlwt.Alignment()
                styles.alignment.horz = xlwt.Alignment.HORZ_CENTER
                styles.alignment.wrap = xlwt.Alignment.NOT_WRAP_AT_RIGHT  # 自动换行
                styles.alignment.vert = xlwt.Alignment.VERT_CENTER  # 垂直对齐
                return styles
    
            sheets.write_merge(0, 0, 0, 13, '学生信息成绩表', set_styles('黑体', 20 * 16, 0x01, 41, 6))  # 合并单元格写入内容
            for i in range(1, rows1):       # 获取行
                for j in range(0, cols1):   # 获取列
                    sheets.write(i, j, sheet1.row_values(i)[j], set_styles('Courier New', 20 * 9, 0x01, 42, 48))  # 向指定行列写入信息
            for i in range(1, rows2):
                for j in range(3, cols2):
                    sheets.write(i, j + 2, sheet2.row_values(i)[j], set_styles('Courier New', 20 * 9, 0x01, 42, 48))
    
            workbook.save("学生信息成绩表.xls")  # 保存到新表
            messagebox.showinfo(title='提示', message="合并成功!")
    
        def createPage(self):       # 设置文本,文本框和按钮组件
            Label(self, text='合并表格', font=("华文彩云")).grid(row=0, column=1, stick=E, pady=10)
            action = ttk.Button(self, text="合并", command=self.doProcess)
            action.grid(row=6, column=1, stick=E, pady=10)
    

    其中主要是对样式的调整,具体内容在注释中。

    9.学生信息的可视化

    通过学号进行所有科目成绩的条形图展示。
    学生成绩条形图
    这里主要用到了matplotlib.这个库,用来进行图形的绘制,相关内容放在链接里了。
    条形图
    代码如下:

    class VisFrame(Frame):
        def __init__(self, master=None):
            Frame.__init__(self, master)
            self.E1 = Entry(self)
            self.createPage()
    
        def Isspace(self, text):                 # 同上
            temp = 0
            for i in text:
                if not i.isspace():
                    temp = 1
                    break
    
            if temp == 1:
                return 0
            else:
                return 1
    
        def click(self):
            num = self.E1.get()
            if self.Isspace(num) :
                messagebox.showinfo(title='提示', message="输入项为空")
            else:
                matplotlib.rcParams['font.sans-serif'] = ['SimHei']                 # 设置条形图可用汉字和为负数
                matplotlib.rcParams['axes.unicode_minus'] = False
    
                workbook = xlrd.open_workbook("学生信息成绩表.xls")
                sheet = workbook.sheet_by_index(0)
                my_dict = dict()
                for i in range(2, sheet.nrows):
                    my_dict_key = sheet.cell_value(i, 1)
                    my_dict_value = sheet.cell_value(i, 2)
                    my_dict[my_dict_key] = my_dict_value
                my_dict = list(map(int, my_dict))
                a = 0
                teamp = 0
                list1 = []
                for i in my_dict:
                    a = a + 1
                    if i == int(num):
                        teamp = 1
                        for j in range(5, sheet.ncols):             # 遍历循环第六行到最后一行的数据
                            list1.append(sheet.cell(a+1, j).value)          # 将遍历的所有数据都放入列表中
    
                        list1 = list(map(int, list1))
                        N = 10                                      # 定义条形的数目
                        name_list = ['高级程序语言', 'python编程', '数据库原理 ', '数据结构与算法', '数学分析', '高等数学', '网络爬虫', '数据可视化', '数据挖掘', '数据分析']          # 定义x轴的显示数据
                        index = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]              # 定义x轴有10个数据
                        plt.ylim(0, 100)                                # y轴是从0100
                        ind = np.arange(N)
                        width = 0.45                                    # 间隔宽度
    
                        p1 = plt.bar(ind, list1, width, facecolor='blue', alpha=0.5, label='分数')           # 设置右上角的标识
                        plt.xticks(index, name_list)
                        plt.xlabel(u"各门学科", fontsize=16)           # 指定x轴描述信息
                        plt.ylabel(u"成绩", fontsize=16)              # 指定y轴描述信息
                        plt.title(sheet.cell_value(a+1, 2)+"的个人成绩条形统计图", fontsize=22)  # 指定图表描述信息
                        plt.hlines(60, -1, 10, linestyles='--')            # 设置再60分时的虚线
                        for rect in p1:                                # 循环遍历将每个的分数显示再数据图的顶部
                          height = rect.get_height()
                          plt.text(rect.get_x() + rect.get_width() / 2, height, height, ha='center', va='bottom', fontsize=14)
                        plt.legend()
                        plt.show()
                if teamp == 1:
                    pass
                else:
                    messagebox.showinfo(title='提示', message="不存在该学生信息!")
    
        def createPage(self):                    # 设置文本,文本框和按钮组件
            Label(self).grid(row=0, stick=W, pady=10)
            Label(self, text='导出学生成绩条形图', font=("华文彩云")).grid(row=0, column=1, stick=N, pady=10)
            Label(self, text='学号: ', font=("华文彩云")).grid(row=1, stick=W, pady=10)
            self.E1.grid(row=1, column=1, stick=E)
            action = ttk.Button(self, text="导出", command=self.click)
            action.grid(row=6, column=1, stick=E, pady=10)
    

    注释比较详细,应该能看懂。

    10.打印个人信息表

    打印个人信息表

    这里的个人信息表是按照老师所要求的格式打印的。
    如图:
    个人信息表
    通过for,if等语句对学生成绩进行分析与计算,详情请看代码及注释。
    代码如下:

    class StuFrame(Frame):
        def __init__(self, master=None):
            Frame.__init__(self, master)
            self.E1 = Entry(self)
            self.createPage()
    
        def Isspace(self, text):                    # 同上
            temp = 0
            for i in text:
                if not i.isspace():
                    temp = 1
                    break
            if temp == 1:
                return 0
            else:
                return 1
    
        def click(self):
            num = self.E1.get()
            if self.Isspace(num):
                messagebox.showinfo(title='提示', message="输入项为空")
            else:                    # 设置表格样式
                workbooks = xlwt.Workbook(encoding='UTF-8')
                sheets = workbooks.add_sheet('Sheet1')
    
                # 设置列宽
                for i in range(0, 8):
                    sheets.col(i).width = 256 * 10
                # 设置行高
                sheets.row(0).height_mismatch = True  # 允许设置行高
                sheets.row(0).height = 20 * 46
                for i in range(1, 18):
                    sheets.row(i).height_mismatch = True
                    sheets.row(i).height = 20 * 20
    
                def set_sty(name, height, borders, colour, horz):  # 设置样式
                    sty = xlwt.XFStyle()
                    sty.font = xlwt.Font()
                    sty.font.name = name  # 设置字体
                    sty.font.height = height  # 设置字体大小
                    sty.borders = xlwt.Borders()
                    # 设置边框
                    sty.borders.left = borders
                    sty.borders.top = borders
                    sty.borders.right = borders
                    sty.borders.bottom = borders
                    # 设置背景
                    sty.pattern = xlwt.Pattern()
                    sty.pattern.pattern = True  # 允许设置背景
                    # style.pattern.pattern_back_colour = 0x04    # 后背景颜色
                    sty.pattern.pattern_fore_colour = colour  # 前背景颜色
                    # 设置表格对齐属性
                    sty.alignment = xlwt.Alignment()
                    sty.alignment.horz = horz
                    sty.alignment.wrap = xlwt.Alignment.NOT_WRAP_AT_RIGHT  # 自动换行
                    sty.alignment.vert = xlwt.Alignment.VERT_CENTER  # 垂直对齐
                    return sty
                # 合并单元格并写入基本内容,设置样式
                sheets.write_merge(0, 0, 0, 7, '学生个人信息表', set_sty('华文行楷', 20 * 26, 0x07, 45, xlwt.Alignment.HORZ_CENTER))
                sheets.write_merge(1, 1, 0, 7, '学生个人信息', set_sty('宋体', 20 * 11, 0x01, 51, xlwt.Alignment.HORZ_CENTER))
                sheets.write_merge(5, 5, 0, 7, '学生成绩信息', set_sty('宋体', 20 * 11, 0x00, 51, xlwt.Alignment.HORZ_CENTER))
                sheets.write_merge(11, 11, 0, 7, '学生成绩分析', set_sty('宋体', 20 * 11, 0x00, 51, xlwt.Alignment.HORZ_CENTER))
                sheets.write_merge(15, 15, 0, 7, '学生成绩数据分析', set_sty('宋体', 20 * 11, 0x01, 51, xlwt.Alignment.HORZ_CENTER))
                sheets.write(2, 0, '姓名:', set_sty('宋体', 20 * 11, 0x01, 31, xlwt.Alignment.HORZ_CENTER))
                sheets.write(2, 4, '学号:', set_sty('宋体', 20 * 11, 0x01, 31, xlwt.Alignment.HORZ_CENTER))
                sheets.write(3, 0, '年级:', set_sty('宋体', 20 * 11, 0x01, 31, xlwt.Alignment.HORZ_CENTER))
                sheets.write(3, 4, '班级:', set_sty('宋体', 20 * 11, 0x01, 31, xlwt.Alignment.HORZ_CENTER))
                sheets.write(4, 0, '专业:', set_sty('宋体', 20 * 11, 0x01, 31, xlwt.Alignment.HORZ_CENTER))
                sheets.write_merge(6, 6, 0, 1, '高级程序语言', set_sty('宋体', 20 * 11, 0x01, 40, xlwt.Alignment.HORZ_LEFT))
                sheets.write_merge(7, 7, 0, 1, '数据库原理', set_sty('宋体', 20 * 11, 0x01, 40, xlwt.Alignment.HORZ_LEFT))
                sheets.write_merge(8, 8, 0, 1, '数学分析', set_sty('宋体', 20 * 11, 0x01, 40, xlwt.Alignment.HORZ_LEFT))
                sheets.write_merge(9, 9, 0, 1, '网络爬虫', set_sty('宋体', 20 * 11, 0x01, 40, xlwt.Alignment.HORZ_LEFT))
                sheets.write_merge(10, 10, 0, 1, '数据挖掘', set_sty('宋体', 20 * 11, 0x01, 40, xlwt.Alignment.HORZ_LEFT))
                sheets.write_merge(6, 6, 4, 5, 'python编程', set_sty('宋体', 20 * 11, 0x01, 40, xlwt.Alignment.HORZ_LEFT))
                sheets.write_merge(7, 7, 4, 5, '数据结构与算法', set_sty('宋体', 20 * 11, 0x01, 40, xlwt.Alignment.HORZ_LEFT))
                sheets.write_merge(8, 8, 4, 5, '高等数学', set_sty('宋体', 20 * 11, 0x01, 40, xlwt.Alignment.HORZ_LEFT))
                sheets.write_merge(9, 9, 4, 5, '数据可视化', set_sty('宋体', 20 * 11, 0x01, 40, xlwt.Alignment.HORZ_LEFT))
                sheets.write_merge(10, 10, 4, 5, '数据分析', set_sty('宋体', 20 * 11, 0x01, 40, xlwt.Alignment.HORZ_LEFT))
                sheets.write_merge(12, 12, 0, 1, '优科目数', set_sty('宋体', 20 * 11, 0x01, 24, xlwt.Alignment.HORZ_CENTER))
                sheets.write_merge(13, 13, 0, 1, '中科目数', set_sty('宋体', 20 * 11, 0x01, 24, xlwt.Alignment.HORZ_CENTER))
                sheets.write_merge(14, 14, 0, 1, '不及格科目数', set_sty('宋体', 20 * 11, 0x01, 24, xlwt.Alignment.HORZ_CENTER))
                sheets.write_merge(16, 16, 0, 1, '总成绩', set_sty('宋体', 20 * 11, 0x01, 46, xlwt.Alignment.HORZ_CENTER))
                sheets.write_merge(17, 17, 0, 1, '绩点', set_sty('宋体', 20 * 11, 0x01, 46, xlwt.Alignment.HORZ_CENTER))
                sheets.write_merge(12, 12, 4, 5, '良科目数', set_sty('宋体', 20 * 11, 0x01, 24, xlwt.Alignment.HORZ_CENTER))
                sheets.write_merge(13, 13, 4, 5, '及格科目数', set_sty('宋体', 20 * 11, 0x01, 24, xlwt.Alignment.HORZ_CENTER))
                sheets.write_merge(16, 16, 4, 5, '平均成绩', set_sty('宋体', 20 * 11, 0x01, 46, xlwt.Alignment.HORZ_CENTER))
                sheets.write_merge(17, 17, 4, 5, '总评', set_sty('宋体', 20 * 11, 0x01, 46, xlwt.Alignment.HORZ_CENTER))
                workbooks.save("学生个人信息表.xls")
                workbook = xlrd.open_workbook("学生信息成绩表.xls")
                my_sheet = workbook.sheet_by_index(0)
                # 循环获得sheet的数据,添加至字典中
                my_dict = dict()
                for i in range(2, my_sheet.nrows):             # 循环遍历的方式将数据放入字典中
                    my_dict_key = my_sheet.cell_value(i, 1)
                    my_dict_value = my_sheet.cell_value(i, 2)
                    my_dict[my_dict_key] = my_dict_value
                my_dict = list(map(int, my_dict))             # 将字典数据转化为整形
                tem = -1
                a = 1
                y = 0
                l = 0
                z = 0
                m = 0
                c = 0
                t = 0
                for o in my_dict:         # 循环遍历将数据放入列表
                    a = a+1
                    if o == int(num):
                        b = []
                        for j in range(5, my_sheet.ncols):
                            b.append(my_sheet.cell(a, j).value)
                        for q in b:                 # 遍历列表中的数据
                            tem = tem + 1
                            if q == '—':           # 如果遇到-就将其转化为0,以免转化为整形时报错
                                b[tem] = 0
                        b = list(map(int, b))
                        p = []
                        for i in b:
                          p.append(int(i))
                        for j in p:                     # 遍历p中的数据判断属于的阶段
                            if (j >= 90) and (j < 100):
                                y = y + 1
                            if (j >= 80) and (j < 90):
                                l = l + 1
                            if (j >= 70) and (j < 80):
                                z = z + 1
                            if (j >= 60) and (j < 70):
                                m = m + 1
                            if j<60:
                                c = c + 1
                    # 计算绩点 jd
                        K = []
                        for i in range(0, 10, 2):
                            for j in p:
                                if (j >= 90) and (j < 100):
                                    K.append(p[i] * 4)
                                    break
                                if (j >= 85) and (j < 90):
                                    K.append(p[i] * 3.7)
                                    break
                                if (j >= 82) and (j < 85):
                                    K.append(p[i] * 3.3)
                                    break
                                if (j >= 78) and (j < 82):
                                    K.append(p[i] * 3)
                                    break
                                if (j >= 75) and (j < 78):
                                    K.append(p[i] * 2.7)
                                    break
                                if (j >= 71) and (j < 75):
                                    K.append(p[i] * 2.3)
                                    break
                                if (j >= 66) and (j < 71):
                                    K.append(p[i] * 2)
                                    break
                                if (j >= 62) and (j < 66):
                                    K.append(p[i] * 1.7)
                                    break
                                if (j >= 60) and (j < 62):
                                    K.append(p[i] * 1.3)
                                    break
                                if j < 60:
                                    K.append(p[i] * 0)
                                    break
                        n = sum(K)
                        jd = n / sum(p)
                        # 计算总成绩 h
                        h = sum(p)
                        # 根据绩点计算优良中差 g
                        g = []
                        if jd >= 4:
                          g = ["优"]
                        if (jd >= 3) and (jd < 4):
                          g = ["良"]
                        if (jd >= 2) and (jd < 3):
                          g = ["中"]
                        if (jd >= 1) and (jd < 2):
                          g = ["及格"]
                        if (jd >= 0) and (jd < 1):
                          g = ["差"]
                        workbook = xlrd.open_workbook("学生个人信息表.xls")
                        data = xlrd.open_workbook("学生个人信息表.xls", formatting_info=True)
                        excel = copy(wb=data)  # 完成xlrd对象向xlwt对象转换
                        excel_table = excel.get_sheet(0)
                        table = data.sheets()[0]
                        # 按位置将所计算出来的数据填入表中,以一定的格式
                        excel_table.write_merge(2, 2, 1, 3, my_sheet.cell_value(a, 2), set_sty('宋体', 20 * 11, 0x01, 31, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(2, 2, 5, 7, my_sheet.cell_value(a, 1), set_sty('宋体', 20 * 11, 0x01, 31, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(3, 3, 1, 3, "2019级", set_sty('宋体', 20 * 11, 0x01, 31, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(3, 3, 5, 7, my_sheet.cell_value(a, 4), set_sty('宋体', 20 * 11, 0x01, 31, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(4, 4, 1, 7, my_sheet.cell_value(a, 3), set_sty('华文楷体', 20 * 16, 0x01, 31, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(6, 6, 2, 3, my_sheet.cell_value(a, 5), set_sty('宋体', 20 * 11, 0x01, 27, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(6, 6, 6, 7, my_sheet.cell_value(a, 6), set_sty('宋体', 20 * 11, 0x01, 27, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(7, 7, 2, 3, my_sheet.cell_value(a, 7), set_sty('宋体', 20 * 11, 0x01, 27, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(7, 7, 6, 7, my_sheet.cell_value(a, 8), set_sty('宋体', 20 * 11, 0x01, 27, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(8, 8, 2, 3, my_sheet.cell_value(a, 9), set_sty('宋体', 20 * 11, 0x01, 27, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(8, 8, 6, 7, my_sheet.cell_value(a, 10), set_sty('宋体', 20 * 11, 0x01, 27, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(9, 9, 2, 3, my_sheet.cell_value(a, 11), set_sty('宋体', 20 * 11, 0x01, 27, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(9, 9, 6, 7, my_sheet.cell_value(a, 12), set_sty('宋体', 20 * 11, 0x01, 27, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(10, 10, 2, 3, my_sheet.cell_value(a, 13), set_sty('宋体', 20 * 11, 0x01, 27, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(10, 10, 6, 7, my_sheet.cell_value(a, 14), set_sty('宋体', 20 * 11, 0x01, 27, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(12, 12, 2, 3, y, set_sty('宋体', 20 * 11, 0x01, 26, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(12, 12, 6, 7, l, set_sty('宋体', 20 * 11, 0x01, 26, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(13, 13, 2, 3, z, set_sty('宋体', 20 * 11, 0x01, 26, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(13, 13, 6, 7, m, set_sty('宋体', 20 * 11, 0x01, 26, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(14, 14, 2, 3, c, set_sty('宋体', 20 * 11, 0x01, 2, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(16, 16, 2, 3, h, set_sty('宋体', 20 * 11, 0x01, 3, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(16, 16, 6, 7, h / 10.0, set_sty('宋体', 20 * 11, 0x01, 3, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(17, 17, 2, 3, jd, set_sty('宋体', 20 * 11, 0x01, 3, xlwt.Alignment.HORZ_CENTER))
                        excel_table.write_merge(17, 17, 6, 7, g, set_sty('宋体', 20 * 11, 0x01, 3, xlwt.Alignment.HORZ_CENTER))
                        excel.save("学生个人信息表.xls")
                        t = 1
                        break
                if t == 1:
                    messagebox.showinfo(title='提示', message="打印成功!")
                else:
                    messagebox.showinfo(title='提示', message="不存在该学生信息!")
    
        def createPage(self):                         # 设置文本,文本框和按钮组件
            Label(self).grid(row=0, stick=W, pady=10)
            Label(self, text='打印个人信息表', font=("华文彩云")).grid(row=0, column=1, stick=N, pady=10)
            Label(self, text='学号: ', font=("华文彩云")).grid(row=3, stick=W, pady=10)
            self.E1.grid(row=3, column=1, stick=E)
            action = ttk.Button(self, text="打印", command=self.click)
            action.grid(row=6, column=1, stick=E, pady=10)
    

    通过for,if等语句对学生成绩进行分析与计算,详情请看代码及注释。

    11.帮助

    帮助
    这部分内容主要就是介绍一哈,重点提一下学校官网这个按钮,是通过webbrowser来实现网页的跳转的。
    代码如下:

    class HelpFrame(Frame):
        def __init__(self, master=None):
            Frame.__init__(self, master)
            self.createPage()
    
        def click(self):
            messagebox.showinfo(title='功能介绍', message="1.该项目主要可用于固定格式的表格的合并。\n2.并对学生的相关信息实现增,删,改,查的功能。\n3.可以绘制个人成绩的条形统计图。\n4.打印个人成绩表格。")
    
        def click1(self):
            messagebox.showinfo(title='反馈', message="如果在使用过程中遇到什么问题,或者有什么更好的建议,希望能够积极向我们反馈。\n联系电话:19115505545\nQQ:1370969596")
    
        def click2(self):
            messagebox.showinfo(title='关于我们', message="项目:学生信息成绩管理系统\n成员:余唯炜,印昌盛,肖春林,唐子怡\n实现语言:python\n工具:PyCharm\n于6月19日完成该项目")
    
        def click3(self):                          # 按钮链接网页跳转
            webbrowser.open("https://www.cqnu.edu.cn/", new=0)
    
        def createPage(self):                     # 设置文本,文本框和按钮组件
            Label(self, text='谢谢使用!', font =("华文彩云")).grid(row=1, column=2, stick=N, pady=10)
            action = ttk.Button(self, text="功能介绍", command=self.click)
            action.grid(row=6, column=1, stick=E, pady=10)
            action = ttk.Button(self, text="反馈", command=self.click1)
            action.grid(row=6, column=3, stick=E, pady=10)
            action = ttk.Button(self, text="关于我们", command=self.click2)
            action.grid(row=7, column=1, stick=E, pady=10)
            action = ttk.Button(self, text="学校官网", command=self.click3)
            action.grid(row=7, column=3, stick=E, pady=10)
    

    总结

    这个项目大概是我一年前写的了,大多数内容不是非常清楚了,但是幸好那个时候注释写的比较详细,大致还是能看懂的,由于那个时候太小白了(虽然现在也是),整个项目其实是我在网上找到的一个模板,然后根据自己的需求改的,东拼西凑出来的,但对于我而已还是成就满满。今天心血来潮将它记录下来了分享给大家,希望我们能够共同努力,一起成长。(代码内容侵删)

    最后完整的代码我已经上传到我的github上了,自取:
    链接: 学生信息管理系统.
    我上传的内容代码内容的路径不正确,需要根据自己的去修改一下,还有就是欢迎界面的图片我没有上传,是gif格式的,自行寻找吧,加油!

    另外为了方便我也将源码上传到了csdn,上面所有的文件都比github齐全: python:xlrd+xlwt+tkinter=学生信息管理系统.rar.

    展开全文
  • 如何在EXCEL表格中批量插入对应图片-最新更新.doc
  • Java 学生信息管理系统1. 项目概述2. 数据库的建立3. 项目页面4. 项目代码 + 分析5. 项目总结 关注博主不迷路,博主带你码代码! 1. 项目概述 这是一个学生信息管理系统,学生信息主要包括:学号,姓名,性别,出生...

    关注博主不迷路,博主带你码代码!

    1. 项目概述

    这是一个学生信息管理系统,学生信息主要包括:学号,姓名,性别,出生日期,班级;暂时就只有这些信息,若后续需要,可以相应的进行添加。
    该项目主要采用的技术是 Java GUI 设计,这个地方主要用 Java 工具 windowsbuilder 进行布局,(windowsbuilder没有安装或者不会安装的,可以看看我的这篇博客 Eclipse 安装 windowbuilder插件 ),MySql 数据库(MySql 数据库没有安装的 或者数据库使用软件 Navicat 没有安装的可以看看我的这篇博客 2021 MySql 8.0.26 安装教程(最详细的傻瓜教程) ),以及使用 Java 中的 JDBC 将数据库链接起来。

    2. 数据库的建立

    由于在项目中没有创建学生数据库的功能,所以学生数据库必须要先建立好,下面给出如何建立好MySQL学生数据库的相关代码 + 图片

    -- 创建数据库
    CREATE DATABASE niit
    DEFAULT CHARACTER SET utf8mb4;
    
    SHOW DATABASES;
    
    -- 使用数据库niit
    USE niit;
    
    -- 创建表Student
    CREATE TABLE Student
    (
    	ID INT PRIMARY KEY, 
    	NAME VARCHAR(4),
    	GENDER CHAR(1),
    	DOB DATE,
    	BATCH INT
    );
    
    -- 插入记录
    INSERT INTO Student VALUES
    (1,'独孤求败','男','1988-1-2',1),
    (2,'周芷若','女','1988-12-3',1),
    (3,'金毛狮王','男','1978-11-1',1),
    (4,'蒙挚','男','1989-2-5',2),
    (5,'夏春','女','1998-4-3',2),
    (6,'梅长苏','男','1999-12-6',2);
    
    -- 查看表中所有记录 语法:select * from 表名
    SELECT * FROM Student;
    
    

    在这里插入图片描述

    3. 项目页面

    主页面
    在这里插入图片描述
    添加学生
    在这里插入图片描述

    修改信息
    在这里插入图片描述

    删除学生
    在这里插入图片描述

    查询信息
    在这里插入图片描述

    4. 项目代码 + 分析

    主页面

    package studentsmanager;
    
    import java.awt.Color;
    import java.awt.EventQueue;
    import java.awt.Font;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    
    public class MainFrame extends JFrame {
    
    	private JPanel contentPane;
    
    	/**
    	 * Launch the application.
    	 */
    	// 有了main函数才可以单独运行
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					MainFrame frame = new MainFrame();
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    	/**
    	 * Create the frame.
    	 */
    	public MainFrame() {
    		// 设置大小不可改变
    		setResizable(false);
    		// 设置标题
    		setTitle("学生管理系统");
    		// 由于这是主页面,所有当主页面关闭的时候,程序就直接退出
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		// setBounds(int x,int y,int width,int height);
    		// x 和 y 是窗口打开时的位置
    		// width 和 height 是窗口打宽度和高度
    		setBounds(100, 100, 450, 350);
    		// setLocationRelativeTo(c)
    		// 设置窗口相对于 c 的位置,当 c 为空或者 null 时,默认为是相对于屏幕中央
    		setLocationRelativeTo(null);
    		// 实例化一个 pane
    		contentPane = new JPanel();
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		contentPane.setLayout(null);
    		
    		JLabel lblNewLabel = new JLabel("学生管理系统");
    		lblNewLabel.setForeground(Color.RED);
    		lblNewLabel.setFont(new Font("宋体", Font.BOLD, 25));
    		lblNewLabel.setBounds(140, 10, 163, 44);
    		contentPane.add(lblNewLabel);
    		
    		JButton addButton = new JButton("添加学生");
    		// addActionListener 注册监听器
    		addButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				// 设置新窗口可见
    				new AddFrame().setVisible(true);
    			}
    		});
    	
    		addButton.setFont(new Font("宋体", Font.PLAIN, 18));
    		addButton.setBounds(167, 64, 114, 37);
    		contentPane.add(addButton);
    		
    		JButton changeButton = new JButton("修改信息");
    		changeButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				// 同上
    				new ChangeFrame().setVisible(true);
    			}
    		});
    		changeButton.setFont(new Font("宋体", Font.PLAIN, 18));
    		changeButton.setBounds(167, 121, 114, 37);
    		contentPane.add(changeButton);
    		
    		JButton deleteButton = new JButton("删除学生");
    		deleteButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				// 同上
    				new DeleteFrame().setVisible(true);
    			}
    		});
    		deleteButton.setFont(new Font("宋体", Font.PLAIN, 18));
    		deleteButton.setBounds(167, 180, 114, 37);
    		contentPane.add(deleteButton);
    		
    		JButton queryButton = new JButton("查询信息");
    		queryButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				// 同上
    				new QueryFrame().setVisible(true);
    			}
    		});
    		queryButton.setFont(new Font("宋体", Font.PLAIN, 18));
    		queryButton.setBounds(167, 240, 114, 37);
    		contentPane.add(queryButton);
    	}
    }
    
    

    在这里插入图片描述

    添加学生

    package studentsmanager;
    
    import java.awt.EventQueue;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.SQLException;
    
    import javax.swing.BoxLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.border.EmptyBorder;
    
    public class AddFrame extends JFrame {
    
    	private JPanel contentPane;
    	private JTextField idField;
    	private JTextField nameField;
    	private JTextField genderField;
    	private JTextField dobField;
    	private JTextField batchField;
    
    	/**
    	 * Launch the application.
    	 */
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					AddFrame frame = new AddFrame();
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    	/**
    	 * Create the frame.
    	 */
    	public AddFrame() {
    		// 和前面类似
    		setResizable(false);
    		setTitle("添加学生");
    		// 这个地方,添加学生只是这个程序的一部分,所以当关闭这部分的时候,程序不直接退出,只是关闭该部分程序
    		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    		setBounds(100, 100, 450, 470);
    		setLocationRelativeTo(null);
    		contentPane = new JPanel();
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
    		
    		JPanel panel = new JPanel();
    		contentPane.add(panel);
    		panel.setLayout(null);
    		
    		JLabel TitleLabel = new JLabel("请输入新学生的信息:");
    		TitleLabel.setFont(new Font("宋体", Font.BOLD, 20));
    		TitleLabel.setBounds(71, 34, 208, 45);
    		panel.add(TitleLabel);
    		
    		JLabel idLabel = new JLabel("学号:");
    		idLabel.setFont(new Font("宋体", Font.PLAIN, 16));
    		idLabel.setBounds(71, 105, 50, 30);
    		panel.add(idLabel);
    		
    		idField = new JTextField();
    		idField.setBounds(143, 99, 240, 45);
    		panel.add(idField);
    		idField.setColumns(10);
    		
    		JLabel nameLabel = new JLabel("姓名:");
    		nameLabel.setFont(new Font("宋体", Font.PLAIN, 16));
    		nameLabel.setBounds(71, 160, 50, 30);
    		panel.add(nameLabel);
    		
    		nameField = new JTextField();
    		nameField.setColumns(10);
    		nameField.setBounds(143, 154, 240, 45);
    		panel.add(nameField);
    		
    		JLabel genderLabel = new JLabel("性别:");
    		genderLabel.setFont(new Font("宋体", Font.PLAIN, 16));
    		genderLabel.setBounds(71, 215, 50, 30);
    		panel.add(genderLabel);
    		
    		genderField = new JTextField();
    		genderField.setColumns(10);
    		genderField.setBounds(143, 209, 240, 45);
    		panel.add(genderField);
    		
    		JLabel dobLabel = new JLabel("出生日期:");
    		dobLabel.setFont(new Font("宋体", Font.PLAIN, 16));
    		dobLabel.setBounds(41, 270, 80, 30);
    		panel.add(dobLabel);
    		
    		dobField = new JTextField();
    		dobField.setColumns(10);
    		dobField.setBounds(143, 264, 240, 45);
    		panel.add(dobField);
    		
    		JLabel batchLabel = new JLabel("班级:");
    		batchLabel.setFont(new Font("宋体", Font.PLAIN, 16));
    		batchLabel.setBounds(71, 325, 50, 30);
    		panel.add(batchLabel);
    		
    		batchField = new JTextField();
    		batchField.setColumns(10);
    		batchField.setBounds(143, 319, 240, 45);
    		panel.add(batchField);
    		
    		JButton addButton = new JButton("添加");
    		// 添加鼠标监听事件
    		addButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				// 先取出数据
    				// getText() 返回字符串类型的
    				// Integer.parseInt 数据类型转换
    				int id = Integer.parseInt(idField.getText());
    
    				String nameString = nameField.getText();
    
    				String genderString = genderField.getText();
    
    				String dobfieldString = dobField.getText();
    
    				int batch = Integer.parseInt(batchField.getText());
    				// 输出一下学生的信息,方便修改
    				System.out.println(id + "\t" + nameString + "\t" + genderString + "\t" + dobfieldString + "\t" + batch);
    				// SQLHelp 是自己写的一个工具类
    				SQLHelp sqlHelp = new SQLHelp();
    				try {
    					// 调用添加学生信息的方法
    					sqlHelp.addStudent(id, nameString, genderString, dobfieldString, batch);
    					// 弹出对话框,提示用户添加成功
    					JOptionPane.showMessageDialog(AddFrame.this, "添加成功!");
    				} catch (SQLException e1) {
    					// 这里捕获一下异常,因为学生的学号是唯一的,所以当学号已经存在的时候,提示用户,该学生信息已存在
    					// 异常代码为 23000
    					if(e1.getSQLState().equals("23000")) {
    						JOptionPane.showMessageDialog(AddFrame.this, "添加失败!该学生已存在");
    					}
    					e1.printStackTrace();
    				}
    
    			}
    		});
    		addButton.setFont(new Font("宋体", Font.PLAIN, 18));
    		addButton.setBounds(182, 389, 97, 33);
    		panel.add(addButton);
    	}
    }
    
    

    添加成功:
    在这里插入图片描述
    添加失败:
    在这里插入图片描述
    修改信息

    package studentsmanager;
    
    import java.awt.EventQueue;
    import java.awt.Font;
    
    import javax.swing.BoxLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.border.EmptyBorder;
    import java.awt.event.ActionListener;
    import java.sql.SQLException;
    import java.awt.event.ActionEvent;
    
    public class ChangeFrame extends JFrame {
    
    	private JPanel contentPane;
    	private JTextField idField;
    	private JTextField nameField;
    	private JTextField genderField;
    	private JTextField dobField;
    	private JTextField batchField;
    	private JTextField searchField;
    	
    
    	/**
    	 * Launch the application.
    	 */
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					ChangeFrame frame = new ChangeFrame();
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    	/**
    	 * Create the frame.
    	 */
    	public ChangeFrame() {
    		setResizable(false);
    		setTitle("修改信息");
    		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    		setBounds(100, 100, 450, 470);
    		setLocationRelativeTo(null);
    		contentPane = new JPanel();
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
    		
    		JPanel panel = new JPanel();
    		contentPane.add(panel);
    		panel.setLayout(null);
    		
    		JLabel lblNewLabel = new JLabel("请输入要修改的学生的学号:");
    		lblNewLabel.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel.setBounds(71, 0, 208, 29);
    		panel.add(lblNewLabel);
    		
    		JLabel lblNewLabel_1 = new JLabel("学号:");
    		lblNewLabel_1.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel_1.setBounds(71, 105, 50, 30);
    		panel.add(lblNewLabel_1);
    		
    		idField = new JTextField();
    		idField.setEditable(false);
    		idField.setBounds(143, 99, 240, 45);
    		panel.add(idField);
    		idField.setColumns(10);
    		
    		JLabel lblNewLabel_1_1 = new JLabel("姓名:");
    		lblNewLabel_1_1.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel_1_1.setBounds(71, 160, 50, 30);
    		panel.add(lblNewLabel_1_1);
    		
    		nameField = new JTextField();
    		nameField.setColumns(10);
    		nameField.setBounds(143, 154, 240, 45);
    		panel.add(nameField);
    		
    		JLabel lblNewLabel_1_1_1 = new JLabel("性别:");
    		lblNewLabel_1_1_1.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel_1_1_1.setBounds(71, 215, 50, 30);
    		panel.add(lblNewLabel_1_1_1);
    		
    		genderField = new JTextField();
    		genderField.setColumns(10);
    		genderField.setBounds(143, 209, 240, 45);
    		panel.add(genderField);
    		
    		JLabel lblNewLabel_1_1_1_1 = new JLabel("出生日期:");
    		lblNewLabel_1_1_1_1.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel_1_1_1_1.setBounds(41, 270, 80, 30);
    		panel.add(lblNewLabel_1_1_1_1);
    		
    		dobField = new JTextField();
    		dobField.setColumns(10);
    		dobField.setBounds(143, 264, 240, 45);
    		panel.add(dobField);
    		
    		JLabel lblNewLabel_1_1_1_2 = new JLabel("班级:");
    		lblNewLabel_1_1_1_2.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel_1_1_1_2.setBounds(71, 325, 50, 30);
    		panel.add(lblNewLabel_1_1_1_2);
    		
    		batchField = new JTextField();
    		batchField.setColumns(10);
    		batchField.setBounds(143, 319, 240, 45);
    		panel.add(batchField);
    		
    		JButton changeButton = new JButton("修改");
    		changeButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
    				
    				int id = Integer.parseInt(searchField.getText());
    				
    				String nameString = nameField.getText();
    				
    				String gendeString = genderField.getText();
    				
    				String dobString = dobField.getText();
    				
    				int batch = Integer.parseInt(batchField.getText());
    				
    				SQLHelp sqlHelp = new SQLHelp();
    				
    				try {
    					sqlHelp.changeStudent(id, nameString, gendeString, dobString, batch);
    					
    					JOptionPane.showMessageDialog(ChangeFrame.this, "修改成功!");
    				} catch (SQLException e) {
    					JOptionPane.showMessageDialog(ChangeFrame.this, "修改失败!");
    					e.printStackTrace();
    				}
    					
    			}
    		});
    		changeButton.setFont(new Font("宋体", Font.PLAIN, 18));
    		changeButton.setBounds(182, 389, 97, 33);
    		panel.add(changeButton);
    		
    		searchField = new JTextField();
    		searchField.setBounds(71, 39, 208, 45);
    		panel.add(searchField);
    		searchField.setColumns(10);
    		
    		JButton searchButton = new JButton("查找");
    		searchButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e){
    				
    				int id = Integer.parseInt(searchField.getText());
    				
    				try {
    					
    					SQLHelp sqlHelp = new SQLHelp();
    					
    					Student student = sqlHelp.queryStudent(id);
    					
    					if(student != null) {
    						
    						// id 是直接读入的,所以就不需要从数据库中读出了
    						idField.setText(String.valueOf(id));
    						nameField.setText(student.getName());
    						genderField.setText(student.getGender());
    						dobField.setText(student.getDob());
    						batchField.setText(String.valueOf(student.getBatch()));
    						
    					} else {
    						JOptionPane.showMessageDialog(ChangeFrame.this, "无此用户");
    					}
    					
    				} catch (SQLException e1) {
    					e1.printStackTrace();
    				}
    				
    			}
    		});
    		searchButton.setFont(new Font("宋体", Font.PLAIN, 18));
    		searchButton.setBounds(289, 42, 97, 39);
    		panel.add(searchButton);
    	}
    }
    
    

    修改前查询到学生信息
    在这里插入图片描述
    修改成功
    在这里插入图片描述
    修改失败
    失败的情况是数据链接出现了问题
    在这里插入图片描述

    未查询到学生信息
    在这里插入图片描述

    删除学生

    package studentsmanager;
    
    import java.awt.EventQueue;
    import java.awt.Font;
    
    import javax.swing.BoxLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.border.EmptyBorder;
    import java.awt.event.ActionListener;
    import java.sql.SQLException;
    import java.awt.event.ActionEvent;
    
    public class DeleteFrame extends JFrame {
    
    	private JPanel contentPane;
    	private JTextField idField;
    	private JTextField nameField;
    	private JTextField genderField;
    	private JTextField dobField;
    	private JTextField batchField;
    	private JTextField searchField;
    	
    
    	/**
    	 * Launch the application.
    	 */
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					DeleteFrame frame = new DeleteFrame();
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    	/**
    	 * Create the frame.
    	 */
    	public DeleteFrame() {
    		setResizable(false);
    		setTitle("删除学生");
    		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    		setBounds(100, 100, 450, 470);
    		setLocationRelativeTo(null);
    		contentPane = new JPanel();
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
    		
    		JPanel panel = new JPanel();
    		contentPane.add(panel);
    		panel.setLayout(null);
    		
    		JLabel lblNewLabel = new JLabel("请输入要删除的学生的学号:");
    		lblNewLabel.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel.setBounds(71, 0, 208, 29);
    		panel.add(lblNewLabel);
    		
    		JLabel lblNewLabel_1 = new JLabel("学号:");
    		lblNewLabel_1.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel_1.setBounds(71, 105, 50, 30);
    		panel.add(lblNewLabel_1);
    		
    		idField = new JTextField();
    		idField.setEditable(false);
    		idField.setBounds(143, 99, 240, 45);
    		panel.add(idField);
    		idField.setColumns(10);
    		
    		JLabel lblNewLabel_1_1 = new JLabel("姓名:");
    		lblNewLabel_1_1.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel_1_1.setBounds(71, 160, 50, 30);
    		panel.add(lblNewLabel_1_1);
    		
    		nameField = new JTextField();
    		nameField.setColumns(10);
    		nameField.setBounds(143, 154, 240, 45);
    		panel.add(nameField);
    		
    		JLabel lblNewLabel_1_1_1 = new JLabel("性别:");
    		lblNewLabel_1_1_1.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel_1_1_1.setBounds(71, 215, 50, 30);
    		panel.add(lblNewLabel_1_1_1);
    		
    		genderField = new JTextField();
    		genderField.setColumns(10);
    		genderField.setBounds(143, 209, 240, 45);
    		panel.add(genderField);
    		
    		JLabel lblNewLabel_1_1_1_1 = new JLabel("出生日期:");
    		lblNewLabel_1_1_1_1.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel_1_1_1_1.setBounds(41, 270, 80, 30);
    		panel.add(lblNewLabel_1_1_1_1);
    		
    		dobField = new JTextField();
    		dobField.setColumns(10);
    		dobField.setBounds(143, 264, 240, 45);
    		panel.add(dobField);
    		
    		JLabel lblNewLabel_1_1_1_2 = new JLabel("班级:");
    		lblNewLabel_1_1_1_2.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel_1_1_1_2.setBounds(71, 325, 50, 30);
    		panel.add(lblNewLabel_1_1_1_2);
    		
    		batchField = new JTextField();
    		batchField.setColumns(10);
    		batchField.setBounds(143, 319, 240, 45);
    		panel.add(batchField);
    		
    		JButton deleteButton = new JButton("删除");
    		deleteButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				
    				int id = Integer.parseInt(searchField.getText());
    				
    				try {
    					SQLHelp sqlHelp = new SQLHelp();
    					
    					sqlHelp.deletestudent(id);
    					
    					JOptionPane.showMessageDialog(DeleteFrame.this, "删除成功!");
    				} catch (SQLException e1) {
    					JOptionPane.showMessageDialog(DeleteFrame.this, "删除失败");
    					e1.printStackTrace();
    				}
    				
    			}
    		});
    		deleteButton.setFont(new Font("宋体", Font.PLAIN, 18));
    		deleteButton.setBounds(182, 389, 97, 33);
    		panel.add(deleteButton);
    		
    		searchField = new JTextField();
    		searchField.setBounds(71, 39, 208, 45);
    		panel.add(searchField);
    		searchField.setColumns(10);
    		
    		JButton searchButton = new JButton("查找");
    		searchButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
    				
    				int id = Integer.parseInt(searchField.getText());
    				
    				try {
    					SQLHelp sqlHelp = new SQLHelp();
    					
    					Student student = sqlHelp.queryStudent(id);
    					
    					if(student != null) {
    						
    						idField.setText(String.valueOf(id));
    						nameField.setText(student.getName());
    						genderField.setText(student.getGender());
    						dobField.setText(student.getDob());
    						batchField.setText(String.valueOf(student.getBatch()));
    						
    					} else {
    						JOptionPane.showMessageDialog(DeleteFrame.this, "无此学生");
    					}
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
    				
    				
    			}
    		});
    		searchButton.setFont(new Font("宋体", Font.PLAIN, 18));
    		searchButton.setBounds(289, 42, 97, 39);
    		panel.add(searchButton);
    	}
    }
    
    

    删除成功
    在这里插入图片描述

    删除失败
    删除失败的时候是数据库链接出现了问题
    在这里插入图片描述

    查询到学生信息
    在这里插入图片描述

    未查询到学生
    在这里插入图片描述

    查询信息

    package studentsmanager;
    
    import java.awt.EventQueue;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.SQLException;
    
    import javax.swing.BoxLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.border.EmptyBorder;
    
    public class QueryFrame extends JFrame {
    
    	private JPanel contentPane;
    	private JTextField idField;
    	private JTextField nameField;
    	private JTextField genderField;
    	private JTextField dobField;
    	private JTextField batchField;
    	private JTextField searchField;
    	
    
    	/**
    	 * Launch the application.
    	 */
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					QueryFrame frame = new QueryFrame();
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    	/**
    	 * Create the frame.
    	 */
    	public QueryFrame() {
    		setResizable(false);
    		setTitle("查询信息");
    		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    		setBounds(100, 100, 450, 470);
    		setLocationRelativeTo(null);
    		contentPane = new JPanel();
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
    		
    		JPanel panel = new JPanel();
    		contentPane.add(panel);
    		panel.setLayout(null);
    		
    		JLabel lblNewLabel = new JLabel("请输入要查找的学生的学号:");
    		lblNewLabel.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel.setBounds(71, 0, 208, 29);
    		panel.add(lblNewLabel);
    		
    		JLabel lblNewLabel_1 = new JLabel("学号:");
    		lblNewLabel_1.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel_1.setBounds(71, 105, 50, 30);
    		panel.add(lblNewLabel_1);
    		
    		idField = new JTextField();
    		idField.setEditable(false);
    		idField.setBounds(143, 99, 240, 45);
    		panel.add(idField);
    		idField.setColumns(10);
    		
    		JLabel lblNewLabel_1_1 = new JLabel("姓名:");
    		lblNewLabel_1_1.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel_1_1.setBounds(71, 160, 50, 30);
    		panel.add(lblNewLabel_1_1);
    		
    		nameField = new JTextField();
    		nameField.setColumns(10);
    		nameField.setBounds(143, 154, 240, 45);
    		panel.add(nameField);
    		
    		JLabel lblNewLabel_1_1_1 = new JLabel("性别:");
    		lblNewLabel_1_1_1.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel_1_1_1.setBounds(71, 215, 50, 30);
    		panel.add(lblNewLabel_1_1_1);
    		
    		genderField = new JTextField();
    		genderField.setColumns(10);
    		genderField.setBounds(143, 209, 240, 45);
    		panel.add(genderField);
    		
    		JLabel lblNewLabel_1_1_1_1 = new JLabel("出生日期:");
    		lblNewLabel_1_1_1_1.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel_1_1_1_1.setBounds(41, 270, 80, 30);
    		panel.add(lblNewLabel_1_1_1_1);
    		
    		dobField = new JTextField();
    		dobField.setColumns(10);
    		dobField.setBounds(143, 264, 240, 45);
    		panel.add(dobField);
    		
    		JLabel lblNewLabel_1_1_1_2 = new JLabel("班级:");
    		lblNewLabel_1_1_1_2.setFont(new Font("宋体", Font.PLAIN, 16));
    		lblNewLabel_1_1_1_2.setBounds(71, 325, 50, 30);
    		panel.add(lblNewLabel_1_1_1_2);
    		
    		batchField = new JTextField();
    		batchField.setColumns(10);
    		batchField.setBounds(143, 319, 240, 45);
    		panel.add(batchField);
    		
    		searchField = new JTextField();
    		searchField.setBounds(71, 39, 208, 45);
    		panel.add(searchField);
    		searchField.setColumns(10);
    		
    		JButton searchButton = new JButton("查找");
    		searchButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
    				
    				// 1.读出要查询的学生输入的id
    				// 因为学生的学号是唯一的,所以我们根据学号查询后,只会有一条数据
    				// 转化一下数据类型
    				int id = Integer.parseInt(searchField.getText());
    				
    				// 2.执行JDBC语句
    				try {
    					SQLHelp sqlHelp = new SQLHelp();
    					
    					Student student = sqlHelp.queryStudent(id);
    					
    					// 3.将查询结果填到文本框中
    					// 前提是学生存在
    					if(student != null) {
    						idField.setText(String.valueOf(id));
    						nameField.setText(student.getName());
    						genderField.setText(student.getGender());
    						dobField.setText(student.getDob());
    						batchField.setText(String.valueOf(student.getBatch()));
    					} else {
    						// 此时学生不存在,提示用户,不存在该学生
    						JOptionPane.showMessageDialog(QueryFrame.this, "无此学生");
    					}
    					
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
    				
    			}
    		});
    		searchButton.setFont(new Font("宋体", Font.PLAIN, 18));
    		searchButton.setBounds(289, 42, 97, 39);
    		panel.add(searchButton);
    	}
    }
    
    

    在这里插入图片描述
    SQLHelp 工具类

    package studentsmanager;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public  class SQLHelp {
    
    	public static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";  
    	public static final String DB_URL = "jdbc:mysql://localhost:3306/niit?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
    
    	public static final String username = "root";
    	public static final String password = "011216";
    	
    	private Connection connection = null;
    	private PreparedStatement pStatement = null;
    	private ResultSet rSet = null;
    	
    	// 加载驱动
    	// 静态初始化块(只执行一次)
    	static {
    		try {
    			Class.forName(JDBC_DRIVER);
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
    	// 链接数据库
    	public void  connectDB() {
    		try {
    			connection = DriverManager.getConnection(DB_URL,username,password);
    			System.out.println("数据库链接成功");
    		} catch (SQLException e) {
    			System.out.println("数据库链接失败");
    			e.printStackTrace();
    		}
    	}
    	
    	// 关闭资源
    	public void close() {
    		if(rSet != null) {
    			try {
    				rSet.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		
    		if(pStatement != null) {
    			try {
    				pStatement.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		
    		if(connection != null) {
    			try {
    				connection.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}
    	
    	public  void addStudent(int id, String nameString, String genderString, String dobString, int batch) throws SQLException {
    		
    		// try finally 无论是否抛出异常都将执行 finally 中的语句
    		try {
    			// 先链接到数据库
    			connectDB();
    			
    			// sql 语句
    			// 静态 sql 语句需要进行字符串拼接
    			// 动态 sql 语句
    			String addsql = "insert into student values(?, ?, ?, ?, ?)";
    			
    			pStatement = connection.prepareStatement(addsql);
    			
    			pStatement.setInt(1, id);
    			pStatement.setString(2, nameString);
    			pStatement.setString(3, genderString);
    			pStatement.setString(4, dobString);
    			pStatement.setInt(5, batch);
    						
    			pStatement.executeUpdate();
    			
    		} finally {
    			
    			close();
    			
    		}
    		
    	}
    	
    	public void changeStudent(int id, String nameString, String genderString, String dobString, int batch) throws SQLException {
    					
    		try {
    			connectDB();
    			
    			String changesql = "update student set name = ?, gender = ?, dob = ?, batch = ? where id = ?";
    					
    			pStatement = connection.prepareStatement(changesql);
    
    			pStatement.setString(1, nameString);
    			pStatement.setString(2, genderString);
    			pStatement.setString(3, dobString);
    			pStatement.setInt(4, batch);
    			pStatement.setInt(5, id);
    					
    			pStatement.executeUpdate();
    			
    		} finally {
    			close();
    		}	
    
    	}
    
    	public void deletestudent(int id) throws SQLException {
    				
    		try {
    			
    			connectDB();
    			
    			String deleteString = "select * from student where id = ?";
    
    			pStatement = connection.prepareStatement(deleteString);
    			
    			pStatement.setInt(1, id);
    			
    			pStatement.execute();
    
    		} finally {
    			close();
    		}
    		
    	}
    	
    	public Student queryStudent(int id) throws SQLException {
    		try {
    			connectDB();
    			
    			String querysql = "select * from student where id = ?";
    			pStatement = connection.prepareStatement(querysql);
    			pStatement.setInt(1, id);
    			// 三种方法执行
    			// execute()	都可以使用,返回true或false
    			// executeQuery() 专门用于查询,返回结果集
    			// executeUpdate() 专门用于删除、更新
    			rSet = pStatement.executeQuery();
    			
    			if(rSet.next()) {
    				
    				String nameString = rSet.getString(2);
    				String genderString = rSet.getString(3);
    				String dobString = rSet.getString(4);
    				int batchString = rSet.getInt(5);
    				
    				// 查询到学生信息返回结果集
    				return new Student(nameString, genderString, dobString, batchString);
    			} else {
    				// 没有查询到学生信息,返回null
    				return null;
    			}
    
    		} finally {
    			close();
    		}
    
    	}
    
    }
    
    

    Student 工具类

    package studentsmanager;
    
    public class Student {
    
    	private String name;
    	private String gender;
    	private String dob;
    	private int batch;
    	
    	public Student(String name, String gender, String dob, int batch) {
    		this.name = name;
    		this.gender = gender;
    		this.dob = dob;
    		this.batch = batch;
    	}
    	
    	public String getName() {
    		return name;
    	}
    	
    	public String getGender() {
    		return gender;
    	}
    	
    	public String getDob() {
    		return dob;
    	}
    	
    	public int getBatch() {
    		return batch;
    	}
    	
    }
    
    

    5. 项目总结

    这算一个比较完整的项目了,既有 GUI 又有 MySQL 数据库的已经 Java 的 JDBC ,虽然已经有了 GUI 界面,但很明显,没有进行任何美化,就只是简单的一个界面,勉勉强强可以看的过去,使用 JDBC 链接数据库的时候,没有实现可以直接在程序创建数据库,只能从数据库方创建数据库,这是一个缺点,同时使用 JDBC 链接数据库的时候,所使用的代码依旧是 MySQL 数据库的代码,(我 MySQL 学的不好,增删改查啥的数据库代码都还记不清楚 哭了…)还有就是当程序在进行修改和删除的时候,修改失败和删除失败的时候,都是因为数据链接失败了才进行弹窗,不知道怎么改成无法修改或者无法删除的时候提示,(又哭了…)
    欢迎个位大佬指出错误,同时也欢迎各位小白借鉴,有问题的话,评论或者私聊都是可以的,看了就会回复!

    最后一句:

    关注博主不迷路,博主带你码代码!

    展开全文
  • 初中信息技术八年级Excel电子表格教案.doc
  • python自动办公-59 PPT_pptx_在PPT中写入图片表格.zip源码python项目实例源码打包下载python自动办公-59 PPT_pptx_在PPT中写入图片表格.zip源码python项目实例源码打包下载python自动办公-59 PPT_pptx_在PPT中...
  • python自动办公-54 Word_docx_批量把图片表格写入Word.zip源码python项目实例源码打包下载python自动办公-54 Word_docx_批量把图片表格写入Word.zip源码python项目实例源码打包下载python自动办公-54 Word_docx_...
  • 在讲网页表格的结构化标记之前,还是先看几幅图片。 Html表格的结构化 所谓的结构化,正如上述第一副图所示,就是把我们的表格划分为三种:表头、表体、表尾。从而当我们在修改表体部分的时候,不会影响到其它两...
  • html学生成绩信息

    万次阅读 2018-08-18 20:58:08
    <h3>2016级计算机科学成绩信息表 学号 姓名 专业 成绩 基本操作 <td>201601 张三 计算机科学 <td>85 删除 <td>201601 张三 计算机科学 <td>85 删除 <td>201601 张三 计算机科学 ...
  • 数据库课设之学生信息管理系统

    万次阅读 多人点赞 2019-07-13 17:31:10
    数据库课设之学生信息管理系统 一、系统需求分析 学校每年都有新生入学、老生毕业,还有其他各种人事变动。如何有效地管理这些学生信息,帮助学校和老师掌握学生的情况,这就是学生信息管理系统需要完成的功能。 ...
  • 学生信息管理系统源码(JAVA 毕业设计) 可直接运行。做毕业设计、课程设计或者想研究下技术的可以下载学习。需要更多资源的可以关注我。
  • Python生成可设置单元格背景色的表格图片一、安装pillow二、代码实现三、测试结果 一、安装pillow Python版本使用Python3.8 pip3 install pillow 二、代码实现 为了简化功能,代码中很多参数固定写死,可以根据需要...
  • 这一个大学生空白个人简历表格是适合2017年毕业的大学生使用的,这是一个下载的简历表格,下面的图片...该文档为大学生空白个人简历表格,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • //简易学生信息管理系统的创建 #includeint main() { int len, i, j; printf("请输入一共多少位学生:\n"); scanf("%d", &len);//从键盘上输入一共多少学生。 struct student * p;//定义一个指针p。 p = ( ...
  • 学校学生管理信息系统是针对学校人事处的大量业务处理工作而开发的管理软件,是典型的管理信息系统(Management Information System)。它是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关...
  • ③showpicture 展示图片 ④connect.php 连接数据库 index.php <!--index.php--> <?php session_start(); ?> <!doctype html> <html> <head> <meta charset="utf-8"> <ti
  • ASP.Net实现学生信息管理系统前端WEB程序

    千次阅读 热门讨论 2019-07-21 11:25:20
    还是学生信息管理系统,同样是有数据库操作。 这两个总的来说第一个收获就是数据库操作语言了,基本的语法都掌握了,感觉还好吧。 第二点 就是web窗体设计中一些细节的东西了,这里面的控件和窗体...
  • 之前写过一篇 Python办公自动化 | 批量...实际需求是这样的,现在有如下格式的若干word文档,需要录入标黄信息到excel,手工录入效率太低了,能不能用python实现呢?答案是肯定的 安装 docxpip install pothon-do...
  • 11、表头下面衬张图片 12、用连字符“&”来合并文本 13、快速打印学生成绩条 14、Excel 帮你选函数 15、同时查看不同工作表中多个单元格内的数据 16、为单元格快速画边框 17、控制特定单元格输入文本的长度 18、成组...
  • python+mysql+tkinter学生信息管理系统

    千次阅读 热门讨论 2021-11-17 15:00:49
    (1)使用mysql存储学生和管理员信息 (2)通过tkinter模块创建图形界面,实现管理员的登录,对学生信息的增删改查,以及修改管理员自己的密码。 整个工程类与方法 数据库设计 使用mysql数据库创建 menege表和...
  • 一、学生信息管理系统 本章使用Python语言开发了一个学生信息管理系统,该系统可以帮助教师快速录入学生信息,并且对学生信息进行基本的增、删、改、查操作;还可以根据排序功能,宏观地看到学生成绩从高到低...
  • java学生信息管理系统(图形界面)

    千次阅读 多人点赞 2021-04-22 22:19:49
    //本程序学生信息数组因为没有填满,所以不能使用 数组名.length 获取数组长度 //只好定义一个length变量来记录数组元素数量(在插入元素时加一) public class ScoreList { private int maxSize = 100;...
  • 这篇文我们讲一下如何制作基于PyQt5和MySQL的学生信息管理系统。 目录一、效果图二、简述制作过程:三、源码及材料:1、源码:2、图片素材: 一、效果图 二、简述制作过程: 1、QtDesigner里绘制UI界面并设置属性 2...
  • 大学生求职简历表格

    2021-01-02 15:15:44
    这是由个人简历网提供给大家下载使用求职简历表格,下面的图片就是这个大学生求职简历表格的打印预览截图了。该文档为大学生求职简历表格,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • C#-学生信息管理系统

    千次阅读 多人点赞 2017-08-24 17:15:58
    该程序实现数据导入、添加、修改、删除。 并显示信息明细,具体包括:学号、姓名、出生日期、性别、电话、邮箱、家庭住址及学生照片信息等。 功能界面如图所示:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,929
精华内容 7,971
关键字:

学生信息表格图片