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,格式大概是这样的:
第一排是题干,第二三四五是选项(填空题的话就没选项,第二空写t来标识)
这个界面我是不太会搞的,place也place不上,那就直接乱七八糟地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 # 随机选择十个题号
别的没什么好说的,逻辑还是很简单的。
最后得分页面如下:
没有专门做判断题,我感觉判断题也是选择的一种。时间比较仓促就没做了。
然后当然很多地方可以优化,比如这个目前只能支持若干道分值相同的题,目前也来不及改了,就先这个样吧。