当前位置: 移动技术网 > IT编程>脚本编程>Python > 【Python】EasyGUI实例——实现NJUCM绩点计算器程序

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

2020年07月20日  | 移动技术网IT编程  | 我要评论

网络上关于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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网