【Python】EasyGUI实例——实现NJUCM绩点计算器程序
程序员文章站
2022-11-05 20:09:55
网络上关于EasyGUI的介绍很多,但实例很少,下午心血来潮,写了一个自己学校的绩点计算器程序,供学习Python和EasyGUI的同志们参考。效果图如下,所有的非法插入均不会通过。首先自己学校绩点计算逻辑如下,若要更改直接在代码里改就ok了。# NJUCM的绩点计算公式为 sum((每门必修课成绩-50)/10*对应的学分))/sum(每门课学分之和)# 必修考查课等级对应分数的关系为,优秀计90,良好计80,中等计70,及格计60。(说实话,我还真不知道未及格怎么计,没人考过...)...
网络上关于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 False
else:
if s.count('.') == 1: # 小数点个数要为1
sl = 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 False
elif left.isdigit() and right.isdigit():
return True
else:
return False
else:
return False
话不多说,所有源代码如下
# -*- coding: utf-8 -*-
# @Time : 2020/7/18 12:02
# @Author : SuperWG
# @File : main.py
# @Software: PyCharm
import easygui as eg
def is_float(s): # 函数功能:判断是否为小数
s = str(s)
if s.isdigit():
return False
else:
if s.count('.') == 1: # 小数点个数要为1
sl = 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 False
elif left.isdigit() and right.isdigit():
return True
else:
return False
else:
return False
# 首页
msg = "请输入您的考试科目数量(整数)"
title = "NJUCM绩点计算器"
fieldNames = ["必修(考试)科目数","必修(考查)科目数"]
fieldValues = []
fieldValues = eg.multenterbox(msg,title, fieldNames)
while 1:
if fieldValues is None: break
errmsg = ""
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-10
errmsg += ('%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: break
errmsg = ""
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-100
errmsg += ('"%s必须为0 ~ 100的整数"\n\n' % fieldNames_kaoshi[i])
if errmsg == "":
break
fieldValues_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: break
errmsg = ""
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~4
errmsg += ('"%s必须为0.5 ~ 4的小数"\n\n' % fieldNames_kaoshi_xuefen[i])
if errmsg == "":
break
fieldValues_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: break
errmsg = ""
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:
break
fieldValues_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: break
errmsg = ""
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 == "":
break
fieldValues_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
本文地址:https://blog.csdn.net/qq_45888298/article/details/107433560
上一篇: 一个查询的SQL语句请教,希望能够用一条SQL语句得到结果
下一篇: 【矩阵】对角线遍历