百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

用python编写一个初中信息科技选择题练习系统

itomcoil 2025-03-03 18:58 5 浏览

软件说明:选择题练习系统


1. 软件简介

选择题练习系统是一款基于 Python 开发的图形化应用程序,旨在帮助用户通过随机抽取题目进行练习,并实时查看答题结果和错题分析。系统支持从 CSV 文件中读取题目,并提供了友好的用户界面,方便用户进行答题和查看错题。


2. 主要功能

  1. 随机抽题
  2. 系统从题库中随机抽取 10 道题目,用户逐题作答。
  3. 答题界面
  4. 每道题目显示题目内容和四个选项,用户点击选项即可选择答案。
  5. 题目前显示当前第几题(如“第 1 题”)。
  6. 得分统计
  7. 每答对一题得 10 分,总分满分为 100 分。
  8. 答题结束后,系统会显示用户的总分。
  9. 错题分析
  10. 答题结束后,用户可以查看错题。
  11. 错题界面显示题目、选项内容、用户答案和正确答案。
  12. 错题内容支持滚动查看,适合错题较多的情况。
  13. 题库支持
  14. 系统从 questions.csv 文件中读取题目,支持自定义题库。
  15. 题库文件格式为 CSV,包含以下字段:question:题目内容。optionAoptionBoptionCoptionD:四个选项。correctAnswer:正确答案(如 ABCD)。

3. 使用说明

3.1 运行环境

  • 操作系统:Windows、macOS、Linux。
  • Python 版本:Python 3.6 及以上。
  • 依赖库tkinterpandas

3.2 运行方式

  1. 直接运行 Python 脚本
  2. 确保已安装 Python 和依赖库。
  3. 选择题练习.pyquestions.csv 放在同一目录下。
  4. 运行以下命令启动程序:
  5. python 选择题练习.py
  6. 运行可执行文件
  7. 使用 PyInstaller 将脚本打包为可执行文件(如 选择题练习.exe)。
  8. 双击 选择题练习.exe 即可运行程序。

3.3 操作步骤

  1. 启动程序
  2. 运行程序后,主界面会显示第一道题目和四个选项。
  3. 答题
  4. 点击选项按钮选择答案。
  5. 点击“下一题”按钮继续答题。
  6. 查看总分
  7. 答完 10 题后,系统会显示总分。
  8. 查看错题
  9. 点击“查看错题”按钮,弹出一个新窗口显示所有错题及其详细信息。

4. 题库文件格式

题库文件 questions.csv 的格式如下:

question

optionA

optionB

optionC

optionD

correctAnswer

Python是一种什么类型的语言?

编译型

解释型

汇编型

机器语言

B

以下哪个是Python的关键字?

class

function

method

loop

A

Python中用于定义函数的关键字是?

def

function

define

func

A


5. 注意事项

  1. 题库文件编码
  2. 确保 questions.csv 文件的编码为 gbkutf-8,否则可能导致程序无法正确读取题目。
  3. 文件路径
  4. 如果直接运行 Python 脚本,确保 questions.csv 文件与脚本在同一目录下。
  5. 如果运行可执行文件,questions.csv 文件会被打包到可执行文件中,无需额外放置。
  6. 错题显示
  7. 如果错题较多,错题界面支持滚动查看,确保所有错题都能显示。

6. 扩展功能

  1. 增加题目数量
  2. 允许用户选择抽取的题目数量。
  3. 支持多种题型
  4. 如多选题、填空题等。
  5. 保存答题记录
  6. 将用户的答题记录保存到文件中,方便后续分析。
import tkinter as tk
from tkinter import ttk, messagebox
import pandas as pd
import random
import sys
import os

def get_resource_path(relative_path):
    """获取资源的绝对路径"""
    if hasattr(sys, '_MEIPASS'):
        # 打包后的路径
        return os.path.join(sys._MEIPASS, relative_path)
    # 开发环境中的路径
    return os.path.join(os.path.abspath("."), relative_path)

class QuizApp:
    def __init__(self, root):
        self.root = root
        self.root.title("初中信息科技练习系统V1.0")
        
        # 设置窗口大小
        self.root.geometry("600x400")
        
        # 读取 CSV 文件,指定编码为 gbk
        self.questions_df = pd.read_csv(get_resource_path("questions.csv"), encoding='gbk')
        
        # 随机抽取 10 题
        self.selected_questions = self.questions_df.sample(n=10).reset_index(drop=True)
        self.current_question_index = 0
        self.score = 0
        
        # 创建界面元素
        self.question_label = tk.Label(root, text="", font=("Arial", 14), wraplength=500)
        self.question_label.pack(pady=20)
        
        self.option_buttons = []
        for i in range(4):
            button = tk.Button(root, text="", font=("Arial", 12), width=20, command=lambda i=i: self.check_answer(i))
            button.pack(pady=5)
            self.option_buttons.append(button)
        
        self.next_button = tk.Button(root, text="下一题", font=("Arial", 12), command=self.next_question)
        self.next_button.pack(pady=20)
        
        self.score_label = tk.Label(root, text="", font=("Arial", 14))
        self.score_label.pack(pady=10)
        
        self.wrong_answers_button = tk.Button(root, text="查看错题", font=("Arial", 12), command=self.show_wrong_answers)
        self.wrong_answers_button.pack(pady=10)
        self.wrong_answers_button.config(state=tk.DISABLED)
        
        # 存储错题
        self.wrong_answers = []
        
        # 显示第一题
        self.show_question()
    
    def show_question(self):
        """显示当前题目"""
        if self.current_question_index < len(self.selected_questions):
            question = self.selected_questions.iloc[self.current_question_index]
            # 显示当前第几题
            self.question_label.config(text=f"第 {self.current_question_index + 1} 题:{question['question']}")
            
            options = [question['optionA'], question['optionB'], question['optionC'], question['optionD']]
            for i, button in enumerate(self.option_buttons):
                button.config(text=options[i])
        else:
            self.show_score()
    
    def check_answer(self, selected_option):
        """检查答案是否正确"""
        question = self.selected_questions.iloc[self.current_question_index]
        correct_answer = question['correctAnswer'].strip().upper()  # 去除空格并转换为大写
        
        # 获取用户选择的选项
        selected_answer = chr(ord('A') + selected_option)
        
        if selected_answer == correct_answer:
            self.score += 10  # 做对一题得 10 分
        else:
            # 只有答错的题目才会被记录
            self.wrong_answers.append({
                'question': question['question'],
                'options': {
                    'A': question['optionA'],
                    'B': question['optionB'],
                    'C': question['optionC'],
                    'D': question['optionD']
                },
                'correct_answer': correct_answer,
                'user_answer': selected_answer
            })
        
        # 显示下一题
        self.next_question()
    
    def next_question(self):
        """显示下一题"""
        self.current_question_index += 1
        if self.current_question_index < len(self.selected_questions):
            self.show_question()
        else:
            self.show_score()
    
    def show_score(self):
        """显示总分"""
        self.question_label.config(text="答题结束!")
        for button in self.option_buttons:
            button.config(state=tk.DISABLED)
        self.next_button.config(state=tk.DISABLED)
        self.score_label.config(text=f"你的总分是:{self.score}/100")
        self.wrong_answers_button.config(state=tk.NORMAL)
    
    def show_wrong_answers(self):
        """显示错题"""
        if not self.wrong_answers:
            messagebox.showinfo("错题", "没有错题!")
            return
        
        # 创建新窗口显示错题
        wrong_answers_window = tk.Toplevel(self.root)
        wrong_answers_window.title("错题及正确答案")
        wrong_answers_window.geometry("600x400")
        
        # 创建滚动条
        scrollbar = tk.Scrollbar(wrong_answers_window)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        
        # 创建文本框
        wrong_answers_text = tk.Text(wrong_answers_window, wrap=tk.WORD, yscrollcommand=scrollbar.set)
        wrong_answers_text.pack(fill=tk.BOTH, expand=True)
        
        # 添加错题内容
        for i, wrong_answer in enumerate(self.wrong_answers):
            wrong_answers_text.insert(tk.END, f"{i+1}. 题目:{wrong_answer['question']}\n")
            wrong_answers_text.insert(tk.END, f"   选项:\n")
            wrong_answers_text.insert(tk.END, f"       A: {wrong_answer['options']['A']}\n")
            wrong_answers_text.insert(tk.END, f"       B: {wrong_answer['options']['B']}\n")
            wrong_answers_text.insert(tk.END, f"       C: {wrong_answer['options']['C']}\n")
            wrong_answers_text.insert(tk.END, f"       D: {wrong_answer['options']['D']}\n")
            wrong_answers_text.insert(tk.END, f"   你的答案:{wrong_answer['user_answer']}\n")
            wrong_answers_text.insert(tk.END, f"   正确答案:{wrong_answer['correct_answer']}\n\n")
        
        # 配置滚动条
        scrollbar.config(command=wrong_answers_text.yview)
        
        # 禁用文本框编辑
        wrong_answers_text.config(state=tk.DISABLED)

# 创建主窗口
root = tk.Tk()

# 创建抽题应用
app = QuizApp(root)

# 运行主循环
root.mainloop()

运行界面如图:

相关推荐

使用opencv-Python进行图像锐化处理

使用OpenCV函数cv::filter2D执行一些拉普拉斯滤波以进行图像锐化使用OpenCV函数cv::distanceTransform以获得二值图像的派生(derived)表示,...

Python-OpenCV 7. 图像二值化

一、介绍图像二值化(ImageBinarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。在数字图像处理中,二值图像占有非常重要的地位,图...

OpenCV+Python裁剪图像

最近使用OpenCV+Python做了一个程序,功能是自动将照片中的文本部分找出来并裁剪/旋转保存为新的图片。这个功能用专业些的说法就是选择并提取感兴趣区域(ROI(RegionofInteres...

简单易懂的人脸识别!用PythonOpenCV实现(适合初...

前言:OpenCV是一个开源的计算机视觉和机器学习库。它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包。根据这个项目的关于页面,OpenCV已被广泛运用在各种项目上,从谷歌街景...

OpenCV行人检测应用方案--基于米尔全志T527开发板

本文将介绍基于米尔电子MYD-LT527开发板(米尔基于全志T527开发板)的OpenCV行人检测方案测试。摘自优秀创作者-小火苗一、软件环境安装1.在全志T527开发板安装OpenCVsudoap...

纯Python构建Web应用:Remi与 OpenCV 结合实现图像处理与展示

引言大家好,我是ICodeWR。在前几篇文章中,我们介绍了Remi的基础功能、多页面应用、动态更新、与Flask结合、与数据库结合、与Matplotlib结合以及与Pandas结合。...

【AI实战项目】基于OpenCV的“颜色识别项目”完整操作过程

OpenCV是一个广受欢迎且极为流行的计算机视觉库,它因其强大的功能、灵活性和开源特性而在开发者和研究者中备受青睐。学习OpenCV主要就是学习里面的计算机视觉算法。要学习这些算法的原理,知道它们适用...

Python自动化操控术:PyAutoGUI全场景实战指南

一、PyAutoGUI核心武器库解析1.1鼠标操控三剑客importpyautogui#绝对坐标移动(闪电速度)pyautogui.moveTo(100,200,duration=0....

从零开始学python爬虫(七):selenium自动化测试框架的介绍

本节主要学习selenium自动化测试框架在爬虫中的应用,selenium能够大幅降低爬虫的编写难度,但是也同样会大幅降低爬虫的爬取速度。在逼不得已的情况下我们可以使用selenium进行爬虫的编写。...

「干货分享」推荐5个可以让你事半功倍的Python自动化脚本

作者:俊欣来源:关于数据分析与可视化相信大家都听说自动化流水线、自动化办公等专业术语,在尽量少的人工干预的情况下,机器就可以根据固定的程序指令来完成任务,大大提高了工作效率。今天小编来为大家介绍几个P...

python+selenium+pytesseract识别图片验证码

一、selenium截取验证码#私信小编01即可获取大量Python学习资源#私信小编01即可获取大量Python学习资源#私信小编01即可获取大量Python学习资源importjso...

Python爬虫实战 | 利用多线程爬取 LOL 高清壁纸

一、背景介绍随着移动端的普及出现了很多的移动APP,应用软件也随之流行起来。最近看到英雄联盟的手游上线了,感觉还行,PC端英雄联盟可谓是爆火的游戏,不知道移动端的英雄联盟前途如何,那今天我们使用到...

一套真实的Python面试题,几十个题目汇总

1.(1)python下多线程的限制以及多进程中传递参数的方式python多线程有个全局解释器锁(globalinterpreterlock),这个锁的意思是任一时间只能有一个线程使用解释器,跟...

一文读透,Python暴力(BF)字符串匹配算法到 KMP 算法之间的变化

1.字符串匹配算法所谓字符串匹配算法,简单地说就是在一个目标字符串中查找是否存在另一个模式字符串。如在字符串"ABCDEFG"中查找是否存在“EF”字符串。可以把字符...

Python实现屏幕自动截图

教程目录需要实现的功能:自动屏幕截图具体需求:1.支持设置截图频率和截图文件存储路径2.在存储截图时判断与前一张截图的相似度,只有屏幕发生了显著的变化才存储截图所需技术(搜索关键词):1.屏幕截...