电子科大《python语言程序设计》结课作业

作业内容与源代码

作业内容:
电子科大《python语言程序设计》结课作业_第1张图片源代码:


import csv
from tkinter import messagebox
import numpy as np
from tkinter import *
import random


class Application(Frame):


    def __init__(self, master=None):
        super().__init__(master)  # 将一系列方法初始化
        self.master = master
        self.i=0
        self.read()
        self.choosenum()
        self.score = 0
        self.pack()
        self.choosebutton()
        self.read()
        self.choosenum()
        self.rmidLbl = Label(self,text="0/10")
        self.rmidLbl.pack(side='top')  #布置一个用以提示当前题目序号的标签
        
    def read(self):
        #读取csv文件中的数据
        questiondata = []
        with open('ques.csv', 'r', encoding='utf-8') as csvfile:
            csv_reader = csv.reader(csvfile)  # 使用csv.reader读取csvfile中的文件
            birth_header = next(csv_reader)  # 读取第一行每一列的标题
            for row in csv_reader:  # 将csv 文件中的数据保存到questiondata中
                questiondata.append(row)

        self.data = np.array(questiondata)  # 将list数组转化成array数组

    def choosebutton(self):
        """创建组件"""
        
        self.v = StringVar()
        self.v.set("o")
        if self.data[self.nums[self.i]][1] != "t":
           #对于选择题,创造四个选项并与字符变量挂钩 
            self.r1 = Radiobutton(self, text='A', value='A', variable=self.v)
            self.r2 = Radiobutton(self, text='B', value='B', variable=self.v)
            self.r3 = Radiobutton(self, text='C', value='C', variable=self.v)
            self.r4 = Radiobutton(self, text='D', value='D', variable=self.v)

            self.r4.pack(side='bottom')
            self.r3.pack(side='bottom')
            self.r2.pack(side='bottom')
            self.r1.pack(side='bottom')
        else:
            #对于填空题,创造一个可以输入的文本框并与字符变量挂钩
            self.v.set("在此输入答案")
            self.fill=Entry(self,textvariable=self.v)
            self.fill.pack(side='bottom')
            self.v.set(self.fill.get())
        self.cfmbtn=Button(self, text='确定', font=("华文行楷", 15), width=20, height=5, command=self.next)
        self.cfmbtn.pack(side='right')#确认按钮

    def showquiz(self):
        self.stem = Message(self, text=self.data[self.nums[self.i]][0], width=700, font=("华文楷体", 15))
        self.stem.pack(side='top')
        if self.data[self.nums[self.i]][1] != "t":
            #对于选择题,对每个选项定义一个message控件并打包
            self.optiona = Message(self, text=self.data[self.nums[self.i]][1], width=700, font=("华文楷体", 12))
            self.optionb = Message(self, text=self.data[self.nums[self.i]][2], width=700, font=("华文楷体", 12))
            self.optionc = Message(self, text=self.data[self.nums[self.i]][3], width=700, font=("华文楷体", 12))
            self.optiond = Message(self, text=self.data[self.nums[self.i]][4], width=700, font=("华文楷体", 12))

            self.optiona.pack(side='top')
            self.optionb.pack(side='top')
            self.optionc.pack(side='top')
            self.optiond.pack(side='top')
        #对于填空题,仅需提供题干即可
        self.rmidLbl.config(text=str(self.i+1)+"/10") #提示当前题号



        
    def count(self):
        #比较答案与输入(选择)的答案,如果正确则获得十分
        print(self.data[self.nums[self.i]])
        print(self.data[self.nums[self.i]][5])
        print("你选的是"+self.v.get())
        if self.data[self.nums[self.i]][5] == self.v.get():
            print(self.v.get())
            self.score += 10


    def clear(self):
        #清除控件
        if self.data[self.nums[self.i]][1] != "t":
            self.optiona.pack_forget()
            self.optionb.pack_forget()
            self.optionc.pack_forget()
            self.optiond.pack_forget()
            self.stem.pack_forget()
            self.r1.pack_forget()
            self.r2.pack_forget()
            self.r3.pack_forget()
            self.r4.pack_forget()
            self.cfmbtn.pack_forget()
        else:
            self.cfmbtn.pack_forget()
            self.stem.pack_forget()
            self.fill.forget()
            
        self.v.set('o')

    def next(self):
        #通过对计数变量i的值的变化来获得并显示下一道题
        if self.i<9:
            #判断是否已经显示过全部的十道题
            if self.v.get() != 'o' and self.v.get()!="在此输入答案":
                #判断是否未输入或未填空
                self.count()
                self.clear()
                print(self.score)
                self.i += 1
                self.choosebutton()
                self.showquiz()
            else:
                messagebox.showinfo('警告', '你未完成作答')
        else:
            #若已经完成作答,则显示得分
            self.count()
            self.clear()
            self.rmidLbl.pack_forget()
            Label(self, text="作答结束,你的得分为:",font=("华文行楷", 25)).pack()
            Label(self, text=str(self.score),font=("Times New Roman", 30),fg="red").pack()
            

            


    def choosenum(self):
        nums = []
        while len(nums) < 10:
            nums.append(random.randint(0, len(self.data) - 1))
            nums = list(set(nums))
        self.nums = nums  # 随机选择十个题号


if __name__ == "__main__":
    root = Tk()
    root.title('自动组卷评卷系统')
    root.geometry('1050x600+200+200')
    app = Application(master=root)
    app.showquiz()



    root.mainloop()

作为科大某边缘学院的大四学渣,几乎没有任何编程基础和项目经验。这个东西完全是我凭借着一腔热血搞了三天从零开始搞出来的。最初我连类都不会的时候,不知道怎么在不同的函数间传递参数,那才是整一个惨字了得。

我的题库是自己手动搞的一个csv文件,也就是代码中的那个ques.csv,格式大概是这样的:
电子科大《python语言程序设计》结课作业_第2张图片第一排是题干,第二三四五是选项(填空题的话就没选项,第二空写t来标识)

界面与运行逻辑

这个界面我是不太会搞的,place也place不上,那就直接乱七八糟地pack了一下。
大概效果如下:
电子科大《python语言程序设计》结课作业_第3张图片然后默认是从题库里选十道题,也就是这个函数:

    def choosenum(self):
        nums = []
        while len(nums) < 10:
            nums.append(random.randint(0, len(self.data) - 1))
            nums = list(set(nums))
        self.nums = nums  # 随机选择十个题号

别的没什么好说的,逻辑还是很简单的。
最后得分页面如下:
电子科大《python语言程序设计》结课作业_第4张图片没有专门做判断题,我感觉判断题也是选择的一种。时间比较仓促就没做了。
然后当然很多地方可以优化,比如这个目前只能支持若干道分值相同的题,目前也来不及改了,就先这个样吧。

你可能感兴趣的:(经验分享,恰饭)