欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【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的同志们参考。
效果图如下,所有的非法插入均不会通过。
【Python】EasyGUI实例——实现NJUCM绩点计算器程序
【Python】EasyGUI实例——实现NJUCM绩点计算器程序
【Python】EasyGUI实例——实现NJUCM绩点计算器程序
【Python】EasyGUI实例——实现NJUCM绩点计算器程序
【Python】EasyGUI实例——实现NJUCM绩点计算器程序
【Python】EasyGUI实例——实现NJUCM绩点计算器程序

首先自己学校绩点计算逻辑如下,若要更改直接在代码里改就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