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

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

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

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


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

运行界面如图:

相关推荐

信创系统下的Anaconda离线配置全攻略

原文链接:「链接」Hello,大家好啊,今天给大家带来一篇信创操作系统上离线配置Anaconda的文章,欢迎大家分享点赞,点个在看和关注吧!在信创环境下使用Anaconda对Python进行包...

【Python】Mac中Anaconda安装与使用(2025)

一、anaconda介绍我是一个多年的Java工程师,之前也写过一些简单的Python程序,随着AI的发展,后续使用Python会越来越多,和Java一样,Python涉及环境配置...

在豆包的协助下,折腾了一天,电脑盲终于把Doccano安装好了

折腾了一天,终于把Doccano软件装好了。先是用Deepseek,提示词:给新手小白出一个在新电脑上安装doccano的教程新手小白安装Doccano终极教程无需编程基础,两种方法任选,全程避坑...

用Python开发日常小软件,让生活与工作更高效!附实例代码

引言:Python如何让生活更轻松?在数字化时代,编程早已不是程序员的专属技能。Python凭借其简洁易学的特点,成为普通人提升效率、解决日常问题的得力工具。无论是自动化重复任务、处理数据,还是开发个...

用python怎么做最简单的桌面计算器

有网友问,用python怎么做一个最简单的桌面计算器。如果只强调简单,在本机运行,不考虑安全性和容错等的话,你能想到的最简单的方案是什么呢?我觉得用tkinter加eval就够简单的。现在开整。首先创...

用python操作excel、word、pdf非常迅速方便,迅速教会你

你会用python操作excel、word、pdf吗?不会也没关系,这篇文章教会你~【文末领取】案例篇幅有限,给大家准备了电子版PDF获取方式:...

10 个每个初学者都应该知道的 Python 技巧

1.无需临时变量交换两个变量的值之前:a=5b=10temp=aa=bb=temp之后:a,b=5,10a,b=b,aprint(a,b)#输出:1051...

SQL用了两年多,分享2个最常用的小技巧

导读:SQL是所有数据从业者必须打牢的基本功之一,扎实的SQL查询和适当的调优技巧是检验SQL能力的两大重要准则。个人曾经专门花费过好多时间用于提升SQL能力,期间也刷了大量的SQL题目,在这期间也...

Python 高手的 15 个代码技巧,让你的编程效率翻倍

在Python编程的世界里,我们总能遇到一些代码写得更短、更快、更整洁的开发者。他们似乎掌握了一些不为人知的秘密。本文将揭示15个实用的Python技巧,这些技巧在初学者教程中鲜有提及,却...

30天学会Python编程:16. Python常用标准库使用教程

16.1collections模块16.1.1高级数据结构16.1.2示例fromcollectionsimportdefaultdict,Counter,deque#默认字典...

7 个小 Python 技巧(python技巧总结60)

1.使用_作为临时变量这一点很微小,但非常强大。有时候你需要一个循环或一个你实际上不会使用的值。比如:for_inrange(3):print("Hello")过去...

如何系统的学python?(如何系统的学剪辑)

我不喜欢一上来就推荐一堆参考资料的东西,那只会让初学者更迷茫。好比一个婴儿,你告诉他学会走路的方法有100种,他只会变的对走路毫无兴趣,他要的只是一种最有效的学会走路的办法,而不是100种。同样的,下...

Python 静态方法、类方法与多态方法:特性解析与实战应用

在Python面向对象编程的重要概念,它们各自具备独特的特性和应用场景,为开发者提供了多样化的编程方式。静态方法不依赖实例状态,类方法以类为操作主体,多态方法则实现了不同类对象对同一消息的差异化响...

用 Python 库 PySimpleGUI 制作自动化办公小软件

Python在运维和办公自动化中扮演着重要的角色,PySimpleGUI是一款很棒的自动化辅助模块,让你更轻松的实现日常任务的自动化。1PySimpleGUI安装在命令行/终端输入:pipin...

一日多技:8个有趣的Python实用技巧

在这一小节中,我们将看到8个实用的python技巧,这些技巧使用比较高频且有用。列表的反向查找:我们可以使用reverse()函数让列表中的元素反向,它处理列表中存在的数字和字符串数据类型。下面我们直...