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

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


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()

运行界面如图:

相关文章

Python随机模块22个函数详解_python 随机ua

随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。平时数据分析各种分布的数据构造也会用到。random模块,用于生成伪随机数,之所以称之为伪随机数,是...

掌握Python中choice函数的用法:随机选择与random模块

知识星球:写代码那些事如果你有收获|欢迎|点赞|关注|转发这里会定期更新|大厂的开发|架构|方案设计这里也会更新|如何摸鱼|抓虾Python教程:Python中choice函数用法欢迎来到写代码那些事...

Python生成随机数_python生成随机数并判断奇偶

生成一个Python随机数 6 分钟阅读Python有一个内置的随机模块来实现此目的。它公开了几个方法,如randrange(),randint(),random(),seed(),uniform()...

Python获取随机数方法汇总_python语言如何获取随机整数

1. random.random()作用:随机生成一个[0,1)之间的浮点数import random print(f'随机生成一个[0,1)之间的浮点数={random.random()}')2....

Python 随机字符串_python 生成随机字符

在很多时候我们可能需要生成一些随机字符串。Python 也为我们提供了生成随机字符串的方法和函数。这个函数是在 random 库中定义的函数 choice。通常 choice 将会从给定的字符串中挑选...

python中随机模块random的用法_pythonrandom随机数的用法

Python 有一个可用于制作随机数的内建模块。现在总结归纳一下,方便大家查询学习random 模块有一组如下的方法:序号方法描述1seed()初始化随机数生成器。2getstate()返回随机数生成...