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

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

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

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


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

运行界面如图:

相关推荐

编程学子看过来,竞赛刷题网站推荐

2022年编程竞赛已经公布,想要在今年取得竞赛成绩的学生,一定要把握寒假时间,学习知识的同时通过刷题,巩固所学知识,提升解题能力。小编为大家推荐几个刷题网站,想要竞赛的学生一定不要错过。USACO美国...

给大家推荐些好的c语言代码的网站

C语言,那就来推荐几个吧,部分含有C++:1、TheLinuxKernelArchives(kernel.org)Linux内核源码,仅限于C,但内核庞大,不太适合新手;2、redis(redi...

推荐几个编程入门学习网站_比较好的编程自学网站

有一些刚上大学的朋友和想对编程感兴趣的朋友经常会让我推荐学习网站,下面几个是我认为零基础学编程比较好的网站,希望大家都有收获!1.W3schoolhttp://www.w3school.com.c...

10个最值得收藏的编程学习网站_有什么学编程的网站

程序员是一个需要不断学习的职业。幸运的是,在这个互联网时代,知识就在那里,等着我们去获取。以下我列举一些免费的编程学习网站包含多个开发语言Java、php、html、javascript等多个。1、h...

6个超酷的练习算法,学习编程的网站

在不了解算法的前提下,您无法通过Google或Facebook的采访。那么为什么不现在学习。我是一位拥有15年以上经验的程序员。从高中开始的第一年,我在算法上学习和工作很多。在我毕业之前,我一直...

在线 python 编程的网站_python3在线编程,python3在线编译器,在线编辑器

以下是一些提供在线Python编程环境的网站:1.Repl.it:Repl.it提供了一个多语言在线编程平台,您可以使用它在任何地方编写、运行、共享代码。Repl.it支持多种编程语言,包括Pyth...

推荐 7 个能过招全球程序员的编程挑战网站,欢迎挑战!

作为程序员的你,是不是经常估不准自己的编程水平?下面推荐7个能过招全球程序员的编程挑战网站,助你磨练技巧,提升技能,最终问鼎代码江湖!1.HackerRank你可以参加各种编码竞赛,比如算法、数学...

盘点 20 个编程学习教程网站,建议收藏

欢迎关注@程序员柠檬橙私信回复「1024」获取海量编程学习资源!如果你想学习编程,现在互联网这么方便,不用着急报名培训班,有很多高质量的编程学习资源网站可供你学习,程序员日常浏览的技术教程网站有哪些...

Flask 数据可视化_flourish数据可视化

数据可视化是数据处理中的重要部分,前面我们了解了Flask的开发和部署,如何用Flask做数据可视化呢?今天我们来了解一下。Python语言极富表达力,并且拥有众多的数据分析库和框架,是数据...

【python 工具】selenium 浏览器操作

selenium的安装步骤:1.安装selenium,打开cmd控制台pipinstallselenium2.安装驱动程序(我这里安装的是chromedriver),用来启动chrome浏览器...

可视化爬虫工具,EasySpider软件体验

现在提起爬虫,大家可能会联想到Python语言,然后就是各种使用无头浏览器去网页上爬取数据,使用Python的过程相较于使用其他语言来说,简单了不少。但毕竟是编程语言,也需要去学习来适配各种网...

cursor+mcp+playwright,让AI给你推荐五一旅游胜地

阅读本文前提当你已了解mcp是什么,若不知,猛击:https://github.com/modelcontextprotocol/servers。最近有个小需求,根据用户输入内容,使用大模型来理解用户...

Cursor+Claude+Playwright:AI 让自动化测试效率暴涨,快到飞起!

一、引言随着AI时代的到来,软件测试变得越来越复杂,如何高效、准确地进行自动化测试成了每一个开发团队必须面对的问题。在日常工作中,测试工作常常面临各种挑战,比如功能复杂、需求频繁变更、时间紧迫等。传统...

推荐一个检测 JS 内存泄漏的神器_js内存泄漏的几种情况

大家好,我是Echa哥。作为一名Web应用程序开发者,排查和修复JavaScript代码的内存泄漏一直是最困扰我的问题之一。最近,Meta开源了一款检测JavaScript代码内存泄漏...

Python+Playwright自动化实战:高效爬虫全攻略

一、为什么选择Playwright?在信息爆炸的时代,数据获取能力直接决定内容生产效率。Playwright作为微软开源的新型自动化工具,凭借以下优势成为技术创作者的新宠:支持Chromium/Web...