网络上关于EasyGUI的介绍很多,但实例很少,下午心血来潮,写了一个自己学校的绩点计算器程序,供学习Python和EasyGUI的同志们参考。
效果图如下,所有的非法插入均不会通过。





首先自己学校绩点计算逻辑如下,若要更改直接在代码里改就ok了。

# NJUCM的绩点计算公式为 sum((每门必修课成绩-50)/10*对应的学分))/sum(每门课学分之和)
# 必修考查课等级对应分数的关系为,优秀计90,良好计80,中等计70,及格计60。(说实话,我还真不知道未及格怎么计,没人考过...)

其次Python没有提供判断是否为浮点数的BIF,不过需要用到,所以要自己写个
这里单独抽出来,存着防止以后要用

def is_float(s):  # 函数功能:判断是否为小数s = str(s)if s.isdigit():return Falseelse:if s.count('.') == 1:  # 小数点个数要为1sl = s.split('.') left = sl[0]  right = sl[1]  if left.startswith('-') and left.count('-') == 1 and right.isdigit():lleft = left.split('-')[1]  # 保存负号后面的数if lleft.isdigit():return True  else:return Falseelif left.isdigit() and right.isdigit():return True  else:return Falseelse:return False

话不多说,所有源代码如下

# -*- coding: utf-8 -*-
# @Time    : 2020/7/18 12:02
# @Author  : SuperWG
# @File    : main.py
# @Software: PyCharm
import easygui as egdef is_float(s):  # 函数功能:判断是否为小数s = str(s)if s.isdigit():return Falseelse:if s.count('.') == 1:  # 小数点个数要为1sl = s.split('.')left = sl[0]right = sl[1]if left.startswith('-') and left.count('-') == 1 and right.isdigit():lleft = left.split('-')[1]  # 保存负号后面的数if lleft.isdigit():return Trueelse:return Falseelif left.isdigit() and right.isdigit():return Trueelse:return Falseelse:return False# 首页
msg = "请输入您的考试科目数量(整数)"
title = "NJUCM绩点计算器"
fieldNames = ["必修(考试)科目数","必修(考查)科目数"]
fieldValues = []
fieldValues = eg.multenterbox(msg,title, fieldNames)
while 1:if fieldValues is None: breakerrmsg = ""for i in range(len(fieldNames)):if fieldValues[i].strip() == "":errmsg += ('请填写%s\n\n' % fieldNames[i])elif not (fieldValues[i].isdigit()) or not (int(fieldValues[i]) in range(0, 10)):  # 判断输入是否是整数且范围是0-10errmsg += ('%s必须为0 ~ 10的整数\n\n' % fieldNames[i])if errmsg == "":if sum(list(map(int, fieldValues))) == 0:errmsg += ("科目数不能同时为0")else:break # errmsg为空退出循环fieldValues = eg.multenterbox(errmsg, title, fieldNames, fieldValues)# 必修(考试)科目成绩输入
msg_kaoshi = "请输入您的必修(考试)科目成绩(整数)"
fieldNames_kaoshi = []
for i in range(0, int(fieldValues[0])):fieldNames_kaoshi.append("第" + str(i + 1) + "门考试成绩")  # 简单的循环实现“第XX门考试”
fieldValues_kaoshi = []
fieldValues_kaoshi = eg.multenterbox(msg_kaoshi, title, fieldNames_kaoshi)
while 1:if fieldValues_kaoshi is None: breakerrmsg = ""for i in range(len(fieldNames_kaoshi)):if fieldValues_kaoshi[i].strip() == "":errmsg += ('"请填写%s"\n\n' % fieldNames_kaoshi[i])elif not (fieldValues_kaoshi[i].isdigit()) or not (int(fieldValues_kaoshi[i]) in range(0, 101)):  # 判断输入是否是整数且范围是0-100errmsg += ('"%s必须为0 ~ 100的整数"\n\n' % fieldNames_kaoshi[i])if errmsg == "":breakfieldValues_kaoshi = eg.multenterbox(errmsg, title, fieldNames_kaoshi, fieldValues_kaoshi)# 必修(考试)科目学分输入
msg_kaoshi_xuefen = "请输入您的必修(考试)科目学分(小数如3.0)"
fieldNames_kaoshi_xuefen = []
for i in range(0, int(fieldValues[0])):fieldNames_kaoshi_xuefen.append("第" + str(i + 1) + "门考试学分")
print(fieldNames_kaoshi_xuefen)
fieldValues_kaoshi_xuefen = []
fieldValues_kaoshi_xuefen = eg.multenterbox(msg_kaoshi_xuefen, title, fieldNames_kaoshi_xuefen)
while 1:if fieldValues_kaoshi_xuefen is None: breakerrmsg = ""for i in range(len(fieldNames_kaoshi_xuefen)):if fieldValues_kaoshi_xuefen[i].strip() == "":errmsg += ('"请填写%s"\n\n' % fieldNames_kaoshi_xuefen[i])elif not (is_float(fieldValues_kaoshi_xuefen[i])) or not (0.5 <= float(fieldValues_kaoshi_xuefen[i]) <= 4):  # 判断输入是否是小数,且范围为0.5~4errmsg += ('"%s必须为0.5 ~ 4的小数"\n\n' % fieldNames_kaoshi_xuefen[i])if errmsg == "":breakfieldValues_kaoshi_xuefen = eg.multenterbox(errmsg, title, fieldNames_kaoshi_xuefen, fieldValues_kaoshi_xuefen)# 必修(考查)科目成绩输入
msg_kaocha = "请输入您的必修(考查)不同等级科目数量" + "[共" + fieldValues[1] +"门,无此项填0]"  # 提示用户总科目数量
fieldNames_kaocha = ["优秀科目数","良好科目数","中等科目数","及格科目数","不及格科目数"]
fieldValues_kaocha = ["0", "0", "0", "0", "0"]  # 默认0门
fieldValues_kaocha = eg.multenterbox(msg_kaocha, title, fieldNames_kaocha)
print(fieldValues_kaocha)
while 1:if fieldValues_kaocha is None: breakerrmsg = ""for i in range(len(fieldNames_kaocha)):if fieldValues_kaocha[i].strip() == "":errmsg += ('"请填写%s"\n\n' % fieldNames_kaocha[i])elif not (fieldValues_kaocha[i].isdigit()):errmsg += ('"%s必须为整数"\n\n' % fieldNames_kaocha[i])if errmsg == "":if int(fieldValues[1]) != sum(list(map(int, fieldValues_kaocha))):errmsg += "请检查是否必修(考查)科目总数是否正确" + "[共" + fieldValues[1] +"门]"  # 除了要判断输入的合法性还要判断科目总数是否正确else:breakfieldValues_kaocha = eg.multenterbox(errmsg, title, fieldNames_kaocha, fieldValues_kaocha)# 必修(考查)科目学分输入
msg_kaocha_xuefen = "请输入您的必修(考查)科目学分(小数)"
fieldNames_kaocha_xuefen = []
grade = ["优秀","良好","中等","及格","不及格"]
for i in range(0, i):if fieldValues_kaocha[i] != 0:for j in range(0, int(fieldValues_kaocha[i])):fieldNames_kaocha_xuefen.append("第" + str(j + 1) + "门等级" + grade[i] + "科目学分")# 这个嵌套循环实现的是如['第1门等级优秀考试学分', '第2门等级优秀科目学分', '第1门等级良好科目学分', '第1门等级中等科目学分', '第1门等级及格科目学分']的效果# 等级按顺序排列,且门数按顺序排列
print(fieldNames_kaocha_xuefen)
fieldValues_kaocha_xuefen = []
fieldValues_kaocha_xuefen = eg.multenterbox(msg_kaocha_xuefen, title, fieldNames_kaocha_xuefen)
while 1:if fieldValues_kaocha_xuefen is None: breakerrmsg = ""for i in range(len(fieldNames_kaocha_xuefen)):if fieldValues_kaocha_xuefen[i].strip() == "":errmsg += ('"请填写%s"\n\n' % fieldNames_kaocha_xuefen[i])elif not (is_float(fieldValues_kaocha_xuefen[i])) or not (0.5 <= float(fieldValues_kaocha_xuefen[i]) <= 4):errmsg += ('"%s必须为0.5 ~ 4的小数"\n\n' % fieldNames_kaocha_xuefen[i])if errmsg == "":breakfieldValues_kaocha_xuefen = eg.multenterbox(errmsg, title, fieldNames_kaocha_xuefen, fieldValues_kaocha_xuefen)# 计算绩点模块
# NJUCM的绩点计算公式为 sum((每门必修课成绩-50)/10*对应的学分))/sum(每门课学分之和)
# 必修考查课等级对应分数的关系为,优秀计90,良好计80,中等计70,及格计60。(说实话,我还真不知道未及格怎么计,没人考过...)
xuefen_sum = sum(list(map(float, fieldValues_kaocha_xuefen))) + sum(list(map(float, fieldValues_kaoshi_xuefen)))
kaoshi_jidian = 0
kaocha_jidian = 0
for i in range(0, int(fieldValues[0])):kaoshi_jidian += (int(fieldValues_kaoshi[i]) - 50) /10 * float(fieldValues_kaoshi_xuefen[i])print(kaoshi_jidian)
temp = fieldValues_kaocha_xuefen
for i in range(0, 5):  # 这边的逻辑想了很长时间,应该有更优的解法,不需要二重循环print("i" + str(i))for j in range(0, int(fieldValues_kaocha[i])):print("j" + str(j))print(fieldValues_kaocha_xuefen)kaocha_jidian += ((100 - 10 * (i + 1)) - 50) /10 * float(fieldValues_kaocha_xuefen[j])for k in range(0, int(fieldValues_kaocha[i])):fieldValues_kaocha_xuefen.remove(temp[0])print(fieldValues_kaocha_xuefen)
print(kaoshi_jidian)
print(kaocha_jidian)
result = (kaoshi_jidian + kaocha_jidian)/xuefen_sum
eg.msgbox("恭喜!\n\n您的绩点为:" + str(result))

总的实践下来,个人觉得EasyGUI确实如其名很easy,不过也有很大的软肋——没法组合功能。每个页面只能使用一个函数控件,没法组合使用…导致美观的UI做不出来(或许可以,我不知道?)
另外必修(考试)和必修(考查)科目数任一不能为0,不然会报错,看了一下,原因是EasyGUI源代码的问题。
且用且宽心吧。
导出的exe执行文件的下载地址:我是地址
以上 如果此篇博客对您有帮助欢迎点赞与转发 有疑问请留言或私信 2020/7/18

【Python】EasyGUI实例——实现NJUCM绩点计算器程序相关推荐

  1. python网络爬虫之农大绩点计算器

    最近在家无聊,正好在网上看到一份不错的python教程,于是就学起了python.python是动态语言且具有函数式编程的特点,相比C/C++.java这类静态语言,有很多不同并且很有意思的地方.在学 ...

  2. python计算平均绩点_【python】以五分制绩点为基础的绩点计算器,可计算学分加权平均...

    [python]以五分制绩点为基础的绩点计算器,可计算学分加权平均 [python]以五分制绩点为基础的绩点计算器,可计算学分加权平均分和平均学分绩点 目录 一.以五分制绩点为基础的绩点计算器 1.1 ...

  3. 【安安教具】-【工具】-【绩点计算】模拟器 教你如何用python制作绩点计算器

    上大学的时候,绩点令人又爱又恨.每次考完试绩点的上下起伏牵动着我们的心... 今天给大家介绍的是:绩点计算器 话不多说,来吧~展示~ 用这个小计算器一条一条把成绩和学分放进去,就可以计算啦~ 以某高校 ...

  4. python制作工资计算器-Python实现扣除个人税后的工资计算器示例

    本文实例讲述了Python实现扣除个人税后的工资计算器.分享给大家供大家参考,具体如下: 正好处于找工作期间避免不了会跟单位谈论薪资的情况,当然所有人跟你谈的都是税前收入,税后应该实际收入有多少呢?今 ...

  5. python计算每月工资-Python实现扣除个人税后的工资计算器示例

    本文实例讲述了Python实现扣除个人税后的工资计算器.分享给大家供大家参考,具体如下: 正好处于找工作期间避免不了会跟单位谈论薪资的情况,当然所有人跟你谈的都是税前收入,税后应该实际收入有多少呢?今 ...

  6. python计算工资编程-Python实现扣除个人税后的工资计算器示例

    本文实例讲述了Python实现扣除个人税后的工资计算器.分享给大家供大家参考,具体如下: 正好处于找工作期间避免不了会跟单位谈论薪资的情况,当然所有人跟你谈的都是税前收入,税后应该实际收入有多少呢?今 ...

  7. GPA——平均绩点计算器(5.0分制)

    平均绩点通常指平均学分绩点(即GPA,Grade Point Average).某些学校采用学分绩点制对学生学习质量进行评定,平均学分绩点是主要考察指标. 本篇博客提供了C++语言编写的GPA计算器, ...

  8. 用python实现视频换脸_超简单使用Python换脸实例

    换脸! 这段时间,deepfakes搞得火热,比方说把<射雕英雄传>里的朱茵换成了杨幂,看下面的图!毫无违和感! 其实早在之前,基于AI换脸的技术就得到了应用,比方说<速度与激情7& ...

  9. python简单编程例子-python简单实例训练(21~30)

    注意:我用的python2.7,大家如果用Python3.0以上的版本,请记得在print()函数哦!如果因为版本问题评论的,不做回复哦!! 21.题目:将一个正整数分解质因数.例如:输入90,打印出 ...

最新文章

  1. ntoskrnl.exe文件丢失或损坏的解决方法
  2. memcache redis
  3. leetcode -day23 Construct Binary Tree from Inorder and Postorder Traversal Construct Binary Tree f
  4. CodeForces Goodbye 2017
  5. php7连接mongodb,批量添加数据
  6. python调用api应用接口_Python接口测试之urllib2库应用
  7. 【数据库原理及应用】经典题库附答案(14章全)——第七章:数据库恢复技术
  8. SQL Server表竖列转横向显示
  9. 使用Maven编译项目遇到——“maven编码gbk的不可映射字符”解决办法 ——转载...
  10. Discuz!X1 to Discuz!NT3.1论坛转换工具 v1.0
  11. 中小企业成败关键在于老板
  12. 在linux centos 7上安装maven
  13. nyoj(简单数学)Oh, my Paper!
  14. mac 上安装selenium, phantomjs 和 chromedriver
  15. mysql字段提取函数_MySQL 字符串截取函数
  16. 记忆测试系统java代码_JAVA课程设计——记忆测试系统(附源程序).doc
  17. github简易教程
  18. PyTorch:DistributedDataParallel(DDP)学习
  19. 摩杜云亮相CDEC2021中国数字智能生态大会,始终专注云+数据
  20. HTTP-web-Internet

热门文章

  1. FFmpeg入门详解之11:H264BSAnalyzer简介
  2. speedoffice(word)如何修改行间距
  3. Word中的mathtype如何按章节插入公式编号
  4. SpringBoot程序排除@Configuration配置类
  5. input的几种禁用方法
  6. VBA 运行时错误‘-2147217900(80040e14):自动化(Automation)错误
  7. ActiveMQ基本详解
  8. 超微A+ Server 4124GS-TNR做主板集成RAID
  9. 报头压缩-ROHC压缩系统
  10. 在线人数统计和总访问量统计