电子科大《python语言程序设计》结课作业
作业内容与源代码
作业内容:
源代码:
import csv
from tkinter import messagebox
import numpy as np
from tkinter import *
import randomclass Application(Frame):def __init__(self, master=None):super().__init__(master) # 将一系列方法初始化self.master = masterself.i=0self.read()self.choosenum()self.score = 0self.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 += 10def 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 += 1self.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 # 随机选择十个题号
别的没什么好说的,逻辑还是很简单的。
最后得分页面如下:
没有专门做判断题,我感觉判断题也是选择的一种。时间比较仓促就没做了。
然后当然很多地方可以优化,比如这个目前只能支持若干道分值相同的题,目前也来不及改了,就先这个样吧。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
