如何用Sikuli自动录入成绩?

简介: 手里明明有一份学生成绩Excel表格,却还得一一手动把它们输入到教务系统?类似这样的简单重复枯燥操作,其实你都可以一键让电脑自动替你完成。痛点期末了,学生们考完试,都愉愉快快放假回家了。

手里明明有一份学生成绩Excel表格,却还得一一手动把它们输入到教务系统?类似这样的简单重复枯燥操作,其实你都可以一键让电脑自动替你完成。

img_00ecc52510fcf67707a4076f07f3d747.png

痛点

期末了,学生们考完试,都愉愉快快放假回家了。

老师们呢?暂时还不能休息。

因为考试成绩,要在一定时间节点之前,录入系统。

在我们学校,这个时限是2周。否则系统一旦切换到下学期课程,本学期的成绩就无法录入了。

辛辛苦苦判完卷子,老师手里往往已经有了一份Excel,包含了全部的分数信息。

有人可能不解?为什么先要弄份Excel出来呢?

因为现在出题,都是有严格的规范要求的。

题型不能单一,题量不能太小,分值不能过于集中……

即便用论文或者报告结课,也需要给出详细的分项成绩。

所以,期末给各项小题分别打分之后,老师们需要跟小学生一样,训练连续加减法。

对于我自己的课来说,还更加麻烦。因为期末的卷面成绩不一定等于期末成绩,这里还有一个系数转换问题。

平时上机课优胜的同学,领先完成了MOOC证书的同学,承担了额外课程任务的同学……这些学生都有系数加分。最终的系数要乘以卷面成绩,放到期末成绩上。

所以,算成绩的时候要有乘法小数运算。

只是乘完了还不行。因为平时成绩占40分,期末成绩占60分。我平时成绩就是按照40分算的。可是系统录入的时候,却需要把它转换成百分制,这样才能保证平时比例加上期末比例刚好是1,否则是需要写情况说明的。

因此,我还需要把平时成绩做除法转换,从40分制转换为百分制。

另外,由于输入成绩必须是整数,因此中间出现的任何小数部分,都需要四舍五入处理……

这些算术题,你真的愿意每个都手算吗?

就算你愿意,你真的还能像十岁时那样,算得那么快,那么好吗?

你行我佩服,反正我做不到。

出于对学生负责的态度,我都是弄一个Excel表格,运用公式替我计算,最后得出总成绩。

顺便说一句,预先算出总成绩是很必要的。

在某些特殊情境下(例如预计挂科率过高),你得在保证名次顺序的情况下,合理变动成绩。在某些专业,这种操作需要运用到开方运算,就更是纸笔算力所不能及的了。

终于,老师们手里有一份最终版成绩了。

只要把这些Excel表格里面的成绩输入到系统,就算见到胜利曙光了。

每当这个时候,我都在教务系统的界面上,寻找“导入Excel”按钮。

但是,我一次次确认,面前的教务系统没有这项功能。

系统设计者,是家国内知名的软件企业。设计师们在用产品传达给教师用户一个信息:

小样儿的,别找了,老老实实手动录入成绩吧!

为了建设合谐社会,此处省略描述我心理活动的若干字词。

把Excel表格里面的成绩,手动搬家到教务系统这个事儿,不仅让人烦恼,而且还很容易出错。特别是一旦抄串行了,又没有及时发现而提交,后果不堪设想。

忍了。

好在一般我期末录入的成绩数量不超过100人。加上本人眼睛还没花,在校准数据,避免串行上还是能够勉强做到的。

但是,其他老师的工作量,就未必只有这些了。

有的老师教的是通修课,好几个班,数百人。成绩好容易都计算出来了,还得手动一一录入到系统。

每年到这个时候,许多老师想想成绩输入这回事儿,都会觉得头痛。

可是把成绩从Excel搬家到教务系统,真的就必须手动操作吗?

自动

答案是否定的。

即便系统没有提供导入功能。

因为这种数据搬家过程,根本就不需要什么酷炫的高科技,只需要让电脑傻傻地重复执行操作就可以了。

如果让你把Excel表格的内容完整录入到系统中,需要几步?

  • 把光标移动到Excel的指定位置;
  • 拷贝该数据;
  • 切换到网络浏览器(成绩系统Web页面);
  • 粘贴该数据;
  • 把光标移动到下一个位置做准备;
  • 切换回Excel里面;
  • 光标移动到下一项;
  • 返回第一步,循环执行。

看,跟把大象装冰箱一样容易。对不对?

这个成绩录入操作清单,下文中将被简称为“清单”。

请注意,其中每一个动作,都对应着操作系统的一个响应操作。

既然我们可以罗列一个清单出来,那么让电脑自动化替我们执行操作,也就有了基础。

我们需要一种特殊编程环境,可以表达与处理清单中的所有动作。

它可以模拟用户的按键输入,可以调用操作系统的窗口切换功能,还得能重复执行若干次动作。

有没有这样的编程环境呢?

环境

当然有。而且还有很多。

Windows上,有AutoHotkey;macOS上,有AppleScript。

但是它们都是单平台工具,而且都需要学习专用的操作语言(虽然并不复杂),这样你的技能就会被局限在某一种操作系统上,不能通用。

今天我推荐给你的这一种编程环境,叫做Sikuli。

img_0642172a8e38a3a5e7016da4551df447.png

它基于Java编写,因此跨平台毫无问题。而且它使用的语言,是Jython。

这个词儿,看着是不是眼熟?

对,它是一种基于Java的Python变种,所以叫做Jython。

img_8c887bdfddf59f0b4fdfaa93a0847b13.png

这样一来,只要你有Python的编程基础,就可以非常轻易地使用Sikuli编程,来处理各种图形界面的操作了。

用这么强悍的工具来录入个成绩,确实是典型的大炮轰蚊子。

不过能轰蚊子,也是好事儿。

我们来看看如何安装Sikuli。

首先你需要到这个地址下载Sikuli的最新版本。本文写作的时候,最新版本是1.1.1。

img_8149f147cefb13fb8affa06691d0ea42.jpe

点击右侧的“Get Version 1.1.1”,找到下载地址。前面说过,Sikuli是跨平台的工具,基于Java。它的下载文件是jar格式的。

img_74fbbf40d5ee368665b4edaf348daf48.jpe

下载之后,你还需要安装JDK 8,以提供Java底层运行环境。注意一定是版本8,因为版本9目前还不支持。

JDK 8的下载地址在这里

我用的是macOS平台,下面的安装过程以苹果系统的安装方式来演示。如果你用的是Windows或者Linux,请参考对应的文档说明来安装对应Java环境。

在macOS下面,JDK 8的安装文件,是dmg格式。双击该文件,出现以下图标:

img_9cd8f4ae4a26ddd23b69cae9377d966d.jpe

双击对话框中的pkg图标,开始安装。

img_8535d75a0f304d0520ecb09dfc8cb313.jpe

安装成功后,会有以下提示:

img_b32950f9c5601a91c55c164f2575dbe4.jpe

JDK 8安装后,咱们就可以使用刚刚下载的jar文件,来安装Sikuli了。

我们到终端里,切换到下载目录,执行以下语句:

java -jar sikulixsetup-1.1.1.jar

屏幕上会显示一大堆文字提示,然后出现以下对话框。

img_6ac8f58af44865b72248ce73cd7eb732.jpe

勾选其中第一个分类,然后点击其中的第一小分项。之后继续。

img_7e1c038bc3b1058dac966f1c272f6558.jpe

遇到提示,询问下载地址。请选择“是”。

然后就会出现不同的文件下载提醒:

img_65d5fb60606474de4a25c218bb623a49.jpe

继续下载:

img_bf10599cb178d7f8fca829813dc7c0cd.jpe

下载完毕以后,安装过程继续提示是否安装Jython 2.7.0。

img_48e1aaa71fad02956e83d5112c4caa4a.jpe

选择是。

img_146d91f4a3cc5cd3fda656d75bc2d1ce.jpe

Jython下载完毕,安装过程顺利结束,会弹出以下对话框:

img_e365268e1c9cacbde883c0051049b960.jpe

好了,至此我们的环境安装配置过程就完成了。

演示

下面,咱们来演示一下用Sikuli自动录入成绩的使用效果。

我建立了一个github项目,用于给你演示自动化程序录入。

请点击这个链接,下载压缩包。然后在本地解压。作为咱们的演示目录

img_e7b862406ac10afe5bfef9b8b968e45b.jpe

目录中,除了说明文件(README.md)之外,一共只有三个文件。

  • scorelist.xlsx,是我们的成绩单文件;
  • score-input.html,是一个模拟成绩登录系统页面;
  • demo-score-input.sikuli,是我们即将调用的Sikuli脚本源文件。

先看看我们的成绩单文件。

为保护真实世界的学生隐私,这里我们没法用真名和真实学号,所以模拟了一份成绩单。

img_63ed6685a592be5063d1b03b6fc78fb7.jpe

我们也不能把学校的教务系统原原本本展示出来,所以只依样画葫芦,做了个最简单的成绩录入页面。

请确保使用Google Chrome浏览器打开该html文件。

img_710e0ad30eda65086aa0a868d21fd6a1.jpe

这里只有10个学生的信息。我们需要录入他们的平时成绩和期末成绩。由于没有备注信息需要录入,所以这一列应该都空着。

我们演示一下Sikuli的执行过程。

进入Sikuli,启动过程需要几秒钟。中间你会看到这样的提示:

img_9496fbc2d3f921cedf938227d9af4192.jpe

进入主界面:

img_330d6bf9839f43a4ed716a53c8a23ee2.jpe

我们定位到演示目录,打开其中的demo-score-input.sikuli文件。

img_0e94e88a3704e676c335ca8f44cb1fc5.jpe

打开后,我们就能看到脚本内容了:

img_60136fa54dcc3a19c50d81934daa7d5a.jpe

对于已经等得不耐烦的老师,咱们先来介绍一下用法:

首先我们到Excel里面,把光标定位到第一个同学的平时成绩。

img_e6017d9059537e78e4b9d414923c5235.jpe

然后到Chrome浏览器里,把光标同样定位在第一个同学的平时成绩录入框。

img_43c365e340ee6724c641b5bce8882491.jpe

然后切换到Sikuli里,执行运行按钮:

img_3e75c3d9d4245d9946558a4044e972b5.jpe

好了,操作完毕。

点击运行按钮后,你会看到如这段视频展示的情景:

注意,这个视频中,除了开始的点击运行按钮是人在操作外,后面所有的动作,都是计算机自动执行的,直到成绩全部录入完毕。

是不是看得眼花缭乱,跃跃欲试了?

代码

别着急。

为了让你自己能够通过对脚本细微修改,满足实际分数录入的需要,我们来简单阅读一下代码。

放心,代码并不长。

第一行代码,我们指定了n的数值。

n = 10

在Excel里,每一个学生的成绩,包括平时和期末,作为一条记录。

这样的记录一共有10条,所以这里我们设定一共需要循环处理的条目数为10次。

假设你班上有50人,可以将其设定为50,以此类推。

紧接着,是一条循环语句:

for i in range(n):

这就是告诉Sikuli,我们要循环执行内部的全部语句,执行次数由前面的n指定。

我们把循环内部的代码分成了4个部分,一一来看。

首先,是从Excel里面拷贝平时成绩。

    switchApp("Microsoft Excel")
    sleep(0.1)
    type("c", Key.CMD)
    sleep(0.1)
    type("c", Key.CMD)
    type(Key.RIGHT)
    sleep(0.2)

注意我们采用switchApp()函数来指定切换到哪一个应用。

应用的名称怎么设置呢?

很简单,在macOS下面,把鼠标移动到屏幕下方Dock上面的对应图标上,看到的提示就是应用的正式名称。照着写就可以。

img_72355113a1d02b95422e9edde37e0c2d.png

其中出现了3条sleep()语句。它们并不是实际执行什么内容,而是让电脑歇一下,不要急于执行下面的语句。

这是因为,有些操作需要一定的响应时间。

如果上一步操作的结果还没有响应,你就急匆匆紧接着执行下面的动作,可能会把原先的计划打乱,导致操作失误。例如还没有拷贝好内容,就进行粘贴,显然是不行的。

因此,几乎每一步操作后,我们都加上一个休眠时间,单位为秒。

另外出现的一个函数为type()

以这一句为例:

type("c", Key.CMD)

我们让Sikuli替我们按下键盘上的c键,同时还要按下控制按键Cmd。

在macOS里面,Cmd + c用来拷贝数据。如果你在Windows下,需要将其修改为Ctrl键。

这样一解释,这一段代码的含义就很清晰了。

我们做了以下动作:

  • 切换到了Excel;
  • 执行了拷贝;
  • 又执行了一遍拷贝;
  • 光标右移一格(到了期末成绩)

每一步之间,我们都让Sikuli休眠一会儿,以保证系统成功响应。

这里解释一下,为什么进行了2步拷贝。

因为在macOS里面,Excel, Word这些应用有时候用快捷键进行拷贝操作时,会出现没有成功拷贝的情况。所以为了保险起见,我不得不经常强迫症一样按下同样的操作键两次。

这里,我们让Sikuli一样执行保守操作。

好了,有了上面的知识基础,我们再来看看下面这段Web浏览器页面操作代码:

    switchApp("Google Chrome")
    sleep(0.1)
    type("a", Key.CMD)
    type("v", Key.CMD)
    type(Key.TAB)
    sleep(0.2)

怎么样,很容易就理解了吧?

梳理一下,我们做了以下操作:

  • 切换到了Chrome浏览器;
  • 选中当前文本框内容;
  • 把剪贴板里面的平时成绩粘贴;
  • 按TAB键,切换到下一个输入文本框(期末成绩)。

之后,我们又回到Excel继续操作:

    switchApp("Microsoft Excel")
    sleep(0.1)
    type("c", Key.CMD)
    sleep(0.1)
    type("c", Key.CMD)
    type(Key.DOWN)
    sleep(0.1)
    type(Key.LEFT)
    sleep(0.2)

这一段代码,我们做了以下动作:

  • 切换到了Excel;
  • 执行了拷贝;
  • 又执行了一遍拷贝;
  • 光标下移一格(到了新记录的期末成绩);
  • 光标左移一格(到了新记录的平时成绩)。

然后,我们又回到了Chrome。

    switchApp("Google Chrome")
    sleep(0.1)
    type("a", Key.CMD)
    type("v", Key.CMD)
    type(Key.TAB)
    sleep(0.1)
    type(Key.TAB)
    sleep(0.2)

最后这段代码,我们做了以下操作:

  • 切换到了Chrome浏览器;
  • 选中当前文本框内容;
  • 把剪贴板里面的平时成绩粘贴;
  • 按TAB键,切换到下一个输入文本框(备注);
  • 按TAB键,切换到下一个输入文本框(新记录的平时成绩)。

好了,这就是全部需要循环的代码了。在Excel和Chrome里,光标都指向了下一条记录的平时成绩位置。

这样再次循环的时候,就是下一条记录的输入了。依此类推。

如果你使用的系统输入界面,和我们的系统有区别,也可以根据上述命令的含义,自行调整细节,以便成功输入。

只是千万不要忘了,在语句之间用sleep()来稍作停顿。

小结

本文我为你展示了如何利用Sikuli编程环境和自动化Jython脚本,把原本枯燥的成绩录入动作,变成一键搞定。

回顾一下,我们介绍了以下内容:

  • 不同操作系统平台上的几个典型自动化脚本工具;
  • 如何安装JDK运行环境;
  • 如何安装Sikuli;
  • 如何执行Sikuli脚本;
  • 如何阅读和修改Sikuli脚本中的Jython代码。

还是那句话,用这么强悍的自动化脚本工具来输入个考试成绩,简直是委屈了它。

其实,Sikuli具有基本图标识别和像素级定位操作能力,被广泛应用于软件测试、桌面监控等领域。

如果你对它感兴趣,推荐你从官方的文档开始,深入阅读学习。

讨论

除了输入成绩以外,你还遇到过哪些需要重复执行枯燥操作指令的场景?你觉得Sikuli能否帮助你有效接管这些繁复的机械动作?除了Sikuli,你还用过哪些好用的自动化脚本工具?欢迎留言,把你的经验和思考分享给大家,我们一起交流讨论。

如果你对我的文章感兴趣,欢迎点赞,并且关注我的专栏,以便收到后续作品更新通知。

如果本文可能对你身边的亲友有帮助,也欢迎你把本文通过微博或朋友圈分享给他们。让他们一起参与到我们的讨论中来。

目录
相关文章
|
Python
十八、通讯录管理系统Python版(对学生的增加,删除,修改,查询,遍历所有学员信息,退出系统,六个功能的实现)
十八、通讯录管理系统Python版(对学生的增加,删除,修改,查询,遍历所有学员信息,退出系统,六个功能的实现)
十八、通讯录管理系统Python版(对学生的增加,删除,修改,查询,遍历所有学员信息,退出系统,六个功能的实现)
|
6月前
|
SQL 关系型数据库 MySQL
MySQL数据库基础练习系列8、成绩录入与分析系统
MySQL数据库基础练习系列8、成绩录入与分析系统
42 1
|
7月前
|
NoSQL Java 关系型数据库
基于java swing和mysql实现的学生选课成绩信息管理系统(源码+数据库+ER图文档+运行指导视频)
基于java swing和mysql实现的学生选课成绩信息管理系统(源码+数据库+ER图文档+运行指导视频)
232 0
|
运维 Shell 应用服务中间件
【运维知识高级篇】超详细的Shell编程讲解3(if判断+Shell菜单+case流程判断+批量创建删除用户+猜数字小游戏)
【运维知识高级篇】超详细的Shell编程讲解3(if判断+Shell菜单+case流程判断+批量创建删除用户+猜数字小游戏)
178 1
|
数据安全/隐私保护 C语言
【C语言】制作“学生管理成绩系统”,内容包括【系统显示】【录入信息】【删除信息】【等级评定】【成绩排序】【成绩修改】【查找学生】涉及循环、结构体和数组等
学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢? 导言 学生菜单系统是基于前阶段的C语言学习,从实际出发,巩固C语言基础的练习,通过多种函数的不同运用,检验知识点的牢固可靠性。 系统设计概述 整个学生系统将会被分成几个内容,将大任务分为多个小任务,并将其合理连接起来,独立而又有联系,对逻辑能力有一定要求(没错,我是木头) 设计多个模块 开发团队信息(即首
【C语言】制作“学生管理成绩系统”,内容包括【系统显示】【录入信息】【删除信息】【等级评定】【成绩排序】【成绩修改】【查找学生】涉及循环、结构体和数组等
|
存储 小程序 网络安全
记一次在网络安全知识竞答小程序中实现导出成绩排行榜时遇到的问题与解决办法
记一次在网络安全知识竞答小程序中实现导出成绩排行榜时遇到的问题与解决办法
记一次在网络安全知识竞答小程序中实现导出成绩排行榜时遇到的问题与解决办法
|
运维 小程序 前端开发
基于小程序云开开发(统计学生信息并导出excel)1.0版本
基于小程序云开开发(统计学生信息并导出excel)1.0版本
124 0
基于小程序云开开发(统计学生信息并导出excel)1.0版本
|
算法 Java
Java初学者作业——学生成绩等级流程图练习
Java初学者作业——学生成绩等级流程图练习
302 1
Java初学者作业——学生成绩等级流程图练习
|
存储 容器
混和头文件实战——7-49 打印学生选课清单(25 分)
混和头文件实战——7-49 打印学生选课清单(25 分) 这题有点容易超时,我试了很多方法,发现用map连接string和一个vector容器是比较好的办法,接下来就给大家介绍介绍~
297 0
混和头文件实战——7-49 打印学生选课清单(25 分)