【Python】EasyGUI实例——实现NJUCM绩点计算器程序
网络上关于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绩点计算器程序相关推荐
- python网络爬虫之农大绩点计算器
最近在家无聊,正好在网上看到一份不错的python教程,于是就学起了python.python是动态语言且具有函数式编程的特点,相比C/C++.java这类静态语言,有很多不同并且很有意思的地方.在学 ...
- python计算平均绩点_【python】以五分制绩点为基础的绩点计算器,可计算学分加权平均...
[python]以五分制绩点为基础的绩点计算器,可计算学分加权平均 [python]以五分制绩点为基础的绩点计算器,可计算学分加权平均分和平均学分绩点 目录 一.以五分制绩点为基础的绩点计算器 1.1 ...
- 【安安教具】-【工具】-【绩点计算】模拟器 教你如何用python制作绩点计算器
上大学的时候,绩点令人又爱又恨.每次考完试绩点的上下起伏牵动着我们的心... 今天给大家介绍的是:绩点计算器 话不多说,来吧~展示~ 用这个小计算器一条一条把成绩和学分放进去,就可以计算啦~ 以某高校 ...
- python制作工资计算器-Python实现扣除个人税后的工资计算器示例
本文实例讲述了Python实现扣除个人税后的工资计算器.分享给大家供大家参考,具体如下: 正好处于找工作期间避免不了会跟单位谈论薪资的情况,当然所有人跟你谈的都是税前收入,税后应该实际收入有多少呢?今 ...
- python计算每月工资-Python实现扣除个人税后的工资计算器示例
本文实例讲述了Python实现扣除个人税后的工资计算器.分享给大家供大家参考,具体如下: 正好处于找工作期间避免不了会跟单位谈论薪资的情况,当然所有人跟你谈的都是税前收入,税后应该实际收入有多少呢?今 ...
- python计算工资编程-Python实现扣除个人税后的工资计算器示例
本文实例讲述了Python实现扣除个人税后的工资计算器.分享给大家供大家参考,具体如下: 正好处于找工作期间避免不了会跟单位谈论薪资的情况,当然所有人跟你谈的都是税前收入,税后应该实际收入有多少呢?今 ...
- GPA——平均绩点计算器(5.0分制)
平均绩点通常指平均学分绩点(即GPA,Grade Point Average).某些学校采用学分绩点制对学生学习质量进行评定,平均学分绩点是主要考察指标. 本篇博客提供了C++语言编写的GPA计算器, ...
- 用python实现视频换脸_超简单使用Python换脸实例
换脸! 这段时间,deepfakes搞得火热,比方说把<射雕英雄传>里的朱茵换成了杨幂,看下面的图!毫无违和感! 其实早在之前,基于AI换脸的技术就得到了应用,比方说<速度与激情7& ...
- python简单编程例子-python简单实例训练(21~30)
注意:我用的python2.7,大家如果用Python3.0以上的版本,请记得在print()函数哦!如果因为版本问题评论的,不做回复哦!! 21.题目:将一个正整数分解质因数.例如:输入90,打印出 ...
最新文章
- ntoskrnl.exe文件丢失或损坏的解决方法
- memcache redis
- leetcode -day23 Construct Binary Tree from Inorder and Postorder Traversal Construct Binary Tree f
- CodeForces Goodbye 2017
- php7连接mongodb,批量添加数据
- python调用api应用接口_Python接口测试之urllib2库应用
- 【数据库原理及应用】经典题库附答案(14章全)——第七章:数据库恢复技术
- SQL Server表竖列转横向显示
- 使用Maven编译项目遇到——“maven编码gbk的不可映射字符”解决办法 ——转载...
- Discuz!X1 to Discuz!NT3.1论坛转换工具 v1.0
- 中小企业成败关键在于老板
- 在linux centos 7上安装maven
- nyoj(简单数学)Oh, my Paper!
- mac 上安装selenium, phantomjs 和 chromedriver
- mysql字段提取函数_MySQL 字符串截取函数
- 记忆测试系统java代码_JAVA课程设计——记忆测试系统(附源程序).doc
- github简易教程
- PyTorch:DistributedDataParallel(DDP)学习
- 摩杜云亮相CDEC2021中国数字智能生态大会,始终专注云+数据
- HTTP-web-Internet
热门文章
- FFmpeg入门详解之11:H264BSAnalyzer简介
- speedoffice(word)如何修改行间距
- Word中的mathtype如何按章节插入公式编号
- SpringBoot程序排除@Configuration配置类
- input的几种禁用方法
- VBA 运行时错误‘-2147217900(80040e14):自动化(Automation)错误
- ActiveMQ基本详解
- 超微A+ Server 4124GS-TNR做主板集成RAID
- 报头压缩-ROHC压缩系统
- 在线人数统计和总访问量统计