您现在的位置是:首页 >技术杂谈 >带UI的python单项选择题评分系统网站首页技术杂谈

带UI的python单项选择题评分系统

Dylan~xiao 2024-08-26 00:01:02
简介带UI的python单项选择题评分系统

在《EXCEL制作选择题试卷,Python快速汇总成绩》的基础上,借助强大的人工智能,快速的完成了一个带UI的单项选择题评分系统。

略谈人工智能

若想精通Python每一个库,顺手拈来海阔天空的写代码,过于理想主义。而人工智能,的确是个强大的工具。提出问题,即可得到相关代码并带有解析说明。运用现有的专业知识验证一翻,不但解决问题还能丰富已有的知识库,学到新的方法,甚至于打开新思路。

用了AI国内一个镜像网站,第一次用微信登录后,IP地址被网站捕获,微信收到一大堆看一看的推送,不胜其烦,用了一个下午才消除这些推送。巧的是,三天后,包头AI视频诈骗登上热搜,人工智能的用户安全心理建设大打折扣。后来,没有登录的情况下,每天三次的提问。

单项选择题评分系统

源文件:MultipleChoice.py

代码:

import tkinter as tk
from tkinter import ttk, filedialog
from openpyxl import Workbook
import openpyxl
import os


class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.master.title("单选题评分系统")
        self.create_widgets()

    def create_widgets(self):
        # 第一行
        folder_label = ttk.Label(self.master, text="试卷文件夹")
        folder_label.grid(row=0, column=0, padx=5, pady=5)

        self.folder_entry = ttk.Entry(self.master, width = 60)
        self.folder_entry.grid(row=0, column=1, padx=5, pady=5)

        browse_button = ttk.Button(self.master, text="浏览...", command=self.browse_folder)
        browse_button.grid(row=0, column=2, padx=5, pady=5)

        # 第二行
        answer_label = ttk.Label(self.master, text="标答")
        answer_label.grid(row=1, column=0, padx=5, pady=5)

        self.answer_entry = ttk.Entry(self.master, width = 60)
        self.answer_entry.grid(row=1, column=1, padx=5, pady=5)
        
        button_score = ttk.Button(self.master, text="评分", command=self.calculate_score)
        button_score.grid(row=1, column=2, padx=5, pady=5)
        
        # 第三行
        file_label = ttk.Label(self.master, text="成绩文件")
        file_label.grid(row=2, column=0, padx=5, pady=5)
        
        self.file_entry = ttk.Entry(self.master, width=60)
        self.file_entry.grid(row=2, column=1, padx=5, pady=5)
        
        button_score = ttk.Button(self.master, text="打开", command=self.open_file)
        button_score.grid(row=2, column=2, padx=5, pady=5)

    def browse_folder(self):
        folder_path = filedialog.askdirectory()
        if folder_path:
            self.folder_entry.delete(0, tk.END)
            self.folder_entry.insert(0, folder_path)
            
    def calculate_score(self):
        path = self.folder_entry.get()
        answer = self.answer_entry.get()
        if not answer:
            return
        
        score_list = []

        #遍历电子表格文件
        for filename in os.listdir(path):
            row_values = []
            if filename.endswith(".xlsx"):
                file_path = os.path.join(path, filename)
                testbook = openpyxl.load_workbook(file_path)
                testsheet = testbook.active
                
                #提取活动工作表A2:C2的值
                for row in testsheet["A2:C2"]:
                    for cell in row:
                        row_values.append(cell.value)
                       
                #提取活动工作表C6至C列最大行号的值
                row_start = 6
                row_end = testsheet.max_row
                
                #读取指定范围内的单元格的值
                stu_answer = []
                for row_num in range(row_start, row_end, 5):
                    cell_reference = 'C' + str(row_num)
                    cell_value = testsheet[cell_reference].value
                    stu_answer.append(cell_value)
                
                #计算分数
                score = 0
                for k in range(0,len(answer)):
                    if answer.upper()[k] == stu_answer[k] or answer.lower()[k] == stu_answer[k]:
                        score += 1
                score= score * 100 / len(answer)
                row_values.append(score)
                testbook.close()
            score_list.append(row_values)
            
        # 生成分数文件            
        score_path = os.path.join(path, "score.xlsx")
        scorebook = openpyxl.Workbook()
        scoresheet = scorebook.active
        for row in score_list:
            scoresheet.append(row)
        scorebook.save(score_path)
        
        if scorebook:
            self.file_entry.delete(0, tk.END)
            self.file_entry.insert(0, score_path)
            
    def open_file(self):
        file_path = self.file_entry.get()
        os.startfile(file_path)
            
# 创建应用程序对象并启动主循环
root = tk.Tk()
app = Application(master = root)
app.mainloop()

生成可执行文件

Pyintsller的官方网站:  PyInstaller Manual — PyInstaller 5.11.0 documentation

1、确保已经安装了pyinstaller。如果没有,在命令提示符窗口安装。

安装命令:pip install pyinstaller

2、在命令行中进入要打包的python程序所在的目录。

3、输入命令生成一个没有控制台窗口的可执行文件。

pyinstaller --onefile --noconsole MultipleChoice.py

几个常用的Pyinstaller命令及其说明。

1、pyinstaller <filename>:  使用默认选项将指定的 Python文件打包成可执行文件。生成的可执行文件将位于dist目录下。

2、pyinstaller --name=<name> <filename>: 指定生成的可执行文件的名称。

3、pyinstaller --onefile <filename>:生成单个可执行文件,而不是一个包含多个文件的文件夹。

4、pyinstaller --noconsole <filename>: 生成一个没有控制台窗口的可执行文件。

5、pyinstaller --hidden-import=<module> <filename>: 指定需要导入但未被检测到的模块。该选项可用于处理由于模块导入顺序问题而导致的ImportError。

这些命令只是PyInstaller提供的众多选项之一。更多选项可以在PyInstaller的官方文档中找到。

运行程序

1、程序界面

2、单击浏览窗口打开试卷所在的文件夹。

3、输入标答

注意:标答时可键盘输入,也可从其他文件拷贝粘贴,大小写通配。

4、单击评分,完成评分并将评分生成的文件路径和名称显示在成绩文件Label。

注意:单击评分后,若试卷文件多,程序运行慢,在窗口标题显示“未响应”,不急,等待一会儿即可。

 5、单击打开按钮打开生成的评分文件。

注意:评分生成的电子表格文件“score.xlsx”放在试卷文件夹,如果想对所有的试卷再次评分,应当将“score.xlsx”移出或删除,否则“score.xlsx”会参与评分,致使评分系统无法继续。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。