Python:一个输入考试测试题的小程序
本意:利用Python和Tkinter作一个考试测试系统,只做了一个输入题目的。请各们高手给出建议。
先看一看运行结果:
功能:增加—保存,在“试题预览”看得到结果,“保存”在“增加”和“编辑”按键后实现,同时更新“试题预览”,”删除" 删除当前的试题,”退出”没有保存文件,直接退出窗口。
代码如下:
1.定义一个stest类:
class Stest():
def init(self,sTitle,answerA,answerB,answerC,answerD,result):
“”“定义单项选择题”""
self.sTitle=sTitle#题目内容
self.tMark=‘■’#题目结束标志
self.answerA=answerA#答案A
self.answerB=answerB#答案A
self.answerC=answerC#答案A
self.answerD=answerD#答案A
self.result=result#正确答案
2.主程序代码:
mport tkinter as tk
from tkinter import scrolledtext
from tkinter.messagebox import *
from tkinter.scrolledtext import *
from Stest import Stest
#定义按钮事件
#保存按钮事件
def bntSf():
#如果有内容为空,则不保存
sTitle=Tentry.get(0.0,‘end’)
answerA=TanswerA.get(0.0,‘end’)
answerB=TanswerB.get(0.0,‘end’)
answerC=TanswerC.get(0.0,‘end’)
answerD=TanswerD.get(0.0,‘end’)
i=Snumber.get()
if ((sTitle.strip()’’)or(answerA.strip()’’)or(answerB.strip()’’)or(answerC.strip()’’)or(answerD.strip()==’’) or (Vanswer.get()==0)):
showerror(title=“错误提示”,message=“题目内容、答案和正确答案不能为空!”)
else:
if Vanswer.get()==1:
result=‘A’
if Vanswer.get()==2:
result=‘B’
if Vanswer.get()==3:
result=‘C’
if Vanswer.get()==4:
result=‘D’
if Bedit.get()==True:
testB=Stest(sTitle,answerA,answerB,answerC,answerD,result)
test.append(testB)
if len(test)>0:
i=len(test)-1
Snumber.set(i)
else:
test[i].sTitle=sTitle
test[i].answerA=answerA
test[i].answerB=answerB
test[i].answerC=answerC
test[i].answerD=answerD
test[i].result=result
LMt.configure(state=‘normal’)
LMt.delete(0.0,‘end’)
for j in range(len(test)):
LMt.insert(tk.END,str(j+1)+’.’+test[j].sTitle+“A.”+test[j].answerA+“B.”+test[j].answerB
+“C.”+test[j].answerC+“D.”+test[j].answerD+“正确答案:”+test[j].result+’\n’)
LMt.grid(row=1,column=0,sticky=‘w’)
LMt.configure(state=‘disabled’)
inputCtrl(‘disabled’)
if i>0:
bntForward.config(state=‘normal’)
bntSave.config(state=‘disabled’)
bntAdd.config(state=‘normal’)
bntEdit.config(state=‘normal’)
bntDel.config(state=‘normal’)
bntExit.config(state=‘normal’)
bntCance.config(state=‘disabled’)
def inputCtrl(State):
#输入控件状态
Tentry.configure(state=State)
TanswerA.configure(state=State)
TanswerB.configure(state=State)
TanswerC.configure(state=State)
TanswerD.configure(state=State)
RanswerA.configure(state=State)
RanswerB.configure(state=State)
RanswerC.configure(state=State)
RanswerD.configure(state=State)
def bntClose():
#关闭主窗口
inputWindow.quit()
def bntAddre():
#“增加”按钮
inputCtrl(‘normal’)
bntSave.config(state=‘normal’)
bntDel.config(state=‘disabled’)
bntExit.config(state=‘disabled’)
bntForward.config(state=‘disabled’)
bntNext.config(state=‘disabled’)
bntEdit.config(state=‘disabled’)
bntAdd.config(state=‘disabled’)
bntCance.config(state=‘normal’)
Tentry.delete(0.0,‘end’)
TanswerA.delete(0.0,‘end’)
TanswerB.delete(0.0,‘end’)
TanswerC.delete(0.0,‘end’)
TanswerD.delete(0.0,‘end’)
Vanswer.set(0)
Bedit.set(‘True’)
def bntEditfg():
#编辑事件
inputCtrl(‘normal’)
bntSave.config(state=‘normal’)
bntDel.config(state=‘disabled’)
bntExit.config(state=‘disabled’)
bntForward.config(state=‘disabled’)
bntNext.config(state=‘disabled’)
bntAdd.config(state=‘disabled’)
bntEdit.config(state=‘disabled’)
bntCance.config(state=‘normal’)
Bedit.set(‘False’)
def bntFd():
#向前翻页
i=Snumber.get()
if i>0:
i-=1
else:
bntForward.config(state=‘disabled’)
if i<len(test):
bntNext.config(state=‘normal’)
disRecorder(i)
Snumber.set(i)
def bntNt():
#定义向后翻阅按钮事件
i=Snumber.get()
if i<len(test)-1:
i+=1
Snumber.set(i)
disRecorder(i)
bntForward.config(state=‘normal’)
def disRecorder(i):
#显示记录
inputCtrl(‘normal’)
Tentry.delete(0.0,‘end’)
TanswerA.delete(0.0,‘end’)
TanswerB.delete(0.0,‘end’)
TanswerC.delete(0.0,‘end’)
TanswerD.delete(0.0,‘end’)
Tentry.insert(tk.END,test[i].sTitle)
TanswerA.insert(tk.END,test[i].answerA)
TanswerB.insert(tk.END,test[i].answerB)
TanswerC.insert(tk.END,test[i].answerC)
TanswerD.insert(tk.END,test[i].answerD)
if test[i].result==‘A’:
Vanswer.set(1)
if test[i].result==‘B’:
Vanswer.set(2)
if test[i].result==‘C’:
Vanswer.set(3)
if test[i].result==‘D’:
Vanswer.set(4)
displayAll()
inputCtrl(‘disabled’)
displayAll()
def bntDl():
#删除记录
i=Snumber.get()
YN=askokcancel(“警告”,“你真的要删除此记录吗?”)
if YN==‘True’:
del test[i]
if i>len(test):
i=len(test)
if i>0:
i-=1
Snumber.set(i)
disRecorder(i)
else:
inputCtrl(‘normal’)
Tentry.delete(0.0,‘end’)
TanswerA.delete(0.0,‘end’)
TanswerB.delete(0.0,‘end’)
TanswerC.delete(0.0,‘end’)
TanswerD.delete(0.0,‘end’)
Vanswer.set(0)
disRecorder()
inputCtrl(‘disabled’)
def displayAll():
#显示所有控件
Tentry.grid(row=1,column=2,padx=5,pady=5)
TanswerA.grid(row=2,column=2,padx=5,pady=2,sticky=‘w’)
TanswerB.grid(row=3,column=2,padx=5,pady=2,sticky=‘w’)
TanswerC.grid(row=4,column=2,padx=5,pady=2,sticky=‘w’)
TanswerD.grid(row=5,column=2,padx=5,pady=2,sticky=‘w’)
TanswerA.grid(row=2,column=2,padx=5,pady=2,sticky=‘w’)
TanswerB.grid(row=3,column=2,padx=5,pady=2,sticky=‘w’)
TanswerC.grid(row=4,column=2,padx=5,pady=2,sticky=‘w’)
TanswerD.grid(row=5,column=2,padx=5,pady=2,sticky=‘w’)
RanswerA.grid(row=0,column=1,padx=5,pady=5)
RanswerB.grid(row=0,column=2,padx=5,pady=5)
RanswerC.grid(row=0,column=3,padx=5,pady=5)
RanswerD.grid(row=0,column=4,padx=5,pady=5)
Fanswer.grid(row=1,column=0,padx=5,pady=5)
#定义例表,用来存储用户输入的单项选择题
test=[]
#定义一个窗口实例
inputWindow=tk.Tk()
inputWindow.title(“题目录入”)
inputWindow.geometry(‘1360x768’)
inputWindow.resizable(width=False,height=False)
#记录当前题序号
Snumber=tk.IntVar()
Snumber.set(0)
Vanswer=tk.IntVar()
#定义标志“编辑”和“增加”的状态
Bedit=tk.BooleanVar()
Bedit.set(‘True’)
#如果Bedit为True,则“向前”、“向后”、“编辑”为不可用,只有
#题目标题及内容输入
#题目标题及内容显示的Frame
Ftitle=tk.Frame(inputWindow,width=500,borderwidth=1,relief=‘raised’,height=650)
#分别定义题目标题及输入内容控件
#题目标示
Ltitle=tk.Label(Ftitle,text=“题目内容:”,justify=‘left’,font=(5))
LanswerA=tk.Label(Ftitle,text=“答案A:”,justify=‘left’,font=(5))
LanswerB=tk.Label(Ftitle,text=“答案B:”,justify=‘left’,font=(5))
LanswerC=tk.Label(Ftitle,text=“答案C:”,justify=‘left’,font=(5))
LanswerD=tk.Label(Ftitle,text=“答案D:”,justify=‘left’,font=(5))
Ftitle.grid(row=0,column=0,padx=5,pady=5)
Ltitle.grid(row=1,column=0,padx=5,pady=2,sticky=‘e’)
LanswerA.grid(row=2,column=0,padx=5,pady=2,sticky=‘e’)
LanswerB.grid(row=3,column=0,padx=5,pady=2,sticky=‘e’)
LanswerC.grid(row=4,column=0,padx=5,pady=2,sticky=‘e’)
LanswerD.grid(row=5,column=0,padx=5,pady=2,sticky=‘e’)
#定义输入
Tentry=tk.scrolledtext.ScrolledText(Ftitle,font=(5),width=35,height=20)
TanswerA=tk.Text(Ftitle,font=(5),width=35,height=2)
TanswerB=tk.Text(Ftitle,font=(5),width=35,height=2)
TanswerC=tk.Text(Ftitle,font=(5),width=35,height=2)
TanswerD=tk.Text(Ftitle,font=(5),width=35,height=2)
#定义答案控件
Vanswer=tk.IntVar()
Fanswer=tk.Frame(inputWindow,width=500,borderwidth=1,relief=‘raised’,height=40)
Lanswer=tk.Label(Fanswer,text=“正确答案:”,justify=‘left’,font=(5))
RanswerA=tk.Radiobutton(Fanswer,text=“A”,font=(5),variable=Vanswer,value=1)
RanswerB=tk.Radiobutton(Fanswer,text=“B”,font=(5),variable=Vanswer,value=2)
RanswerC=tk.Radiobutton(Fanswer,text=“C”,font=(5),variable=Vanswer,value=3)
RanswerD=tk.Radiobutton(Fanswer,text=“D”,font=(5),variable=Vanswer,value=4)
Lanswer.grid(row=0,column=0,padx=5,pady=5,sticky=‘e’)
#按钮控件
Fbnt=tk.Frame(inputWindow,width=500,borderwidth=1,relief=‘raised’,height=40,bg=’#007ACC’)
bntForward=tk.Button(Fbnt,text=“向前”,font=(5),command=bntFd)
bntNext=tk.Button(Fbnt,text=“向后”,font=(5),command=bntNt)
bntEdit=tk.Button(Fbnt,text=“编辑”,font=(5),command=bntEditfg)
bntDel=tk.Button(Fbnt,text=“删除”,font=(5),command=bntDl)
bntSave=tk.Button(Fbnt,text=“保存”,font=(5),command=bntSf)
bntCance=tk.Button(Fbnt,text=“取消”,font=(5))
bntAdd=tk.Button(Fbnt,text=“增加”,font=(5),command=bntAddre)
bntExit=tk.Button(Fbnt,text=“退出”,font=(5),command=bntClose)
bntForward.grid(row=0,column=1)
bntNext.grid(row=0,column=2)
bntDel.grid(row=0,column=3,padx=10)
bntEdit.grid(row=0,column=4)
bntSave.grid(row=0,column=5)
bntCance.grid(row=0,column=6)
bntAdd.grid(row=0,column=7)
bntExit.grid(row=0,column=8,padx=27)
Fbnt.grid(row=2,column=0,padx=5,pady=5)
#录入题目结果显示
RselT=tk.StringVar()
FRseltT=tk.Frame(inputWindow,width=830,borderwidth=1,relief=‘raised’,height=745)
Vtitle=tk.Label(FRseltT,text=“试题预览”,font=(20))
LMt=ScrolledText(FRseltT,font=(5),width=80,height=35)
LMt.configure(state=‘disabled’)
Vtitle.grid(row=0,column=0,padx=5)
LMt.grid(row=1,column=0,padx=2,pady=5,sticky=‘w’)
FRseltT.grid(row=0,rowspan=3,column=1,padx=5,pady=5)
displayAll()
#定位显示所有控件
FRseltT.grid_propagate(0)
Fbnt.grid_propagate(0)
Fanswer.grid_propagate(0)
Ftitle.grid_propagate(0)
#如果没有题目,则只有“增加”和“退出”两个按钮可用
if Snumber.get()==0:
bntForward.config(state=‘disabled’)
bntNext.config(state=‘disabled’)
bntEdit.config(state=‘disabled’)
bntSave.config(state=‘disabled’)
bntDel.config(state=‘disabled’)
bntCance.config(state=‘disabled’)
inputCtrl(‘disabled’)
else:
bntForward.config(state=‘normal’)
bntNext.config(state=‘normal’)
bntEdit.config(state=‘normal’)
bntSave.config(state=‘normal’)
bntDel.config(state=‘normal’)
inputCtrl(‘normal’)
inputWindow.mainloop()
3.请各位给出建议