当前位置:首页 » tkinter » 正文

用tkinter的多行文本框组件做一个答题程序,有源码

  tkinter的多行文本框Text组件,可以插入文本,图片,插入组件,插件的组件也可以响应事件,也可以绑定滚动条,这决定了用tkinter的多行文本框组件可以做一个答题程序。

  这个答题程序,我还是采取一个txt文件做题库,有些代码,就采用了我前面的文章:用tkinter做一个简单的答题系统:单选题,大家也可以回看这篇文章,互相参考一下。

  我的题库只有10道题,你可以任意加多少题目,只要修改txt文件的题库就行了。

  程序也有简单的核对答案部分,只是我做得太简单了,只是用print()方法输出,是有点偷懒了。

  事先要在你的代码目录里,保存题库文件:car3.txt ,以及代码目录里的子文件夹 image 保存2个相关的图片 car_1.gif 和 car_2.gif

  题库内容如下,请将这个txt文件编码保存为UTF-8编码格式

驾驶机动车在道路上违反道路交通安全法的行为,属于什么行为?,过失行为,违规行为,违章行为,违法行为,4,,
机动车驾驶人违法驾驶造成重大交通事故构成犯罪的,依法追究什么责任?,刑事责任,民事责任,直接责任,经济责任,1,,
机动车驾驶人造成事故后逃逸构成犯罪的,吊销驾驶证多长时间不得重新取得驾驶证?,5年内,10年内,20年内,终生,4,,
驾驶机动车应当随身携带哪种证件?,职业资格证,身份证,驾驶证,工作证,3,,
本程序的原创来自"五笔打字通"(网名),五笔打字通有自己的网站,他的网站是:,taobao.com,wb98.com,baidu.com,163.com,2,,
驾驶机动车在路口直行遇到这种信号灯应该怎样行驶?,不得越过停止线,加速直行通过,左转弯行驶,进入路口等待,1,car_1.gif,
下列做法哪些可以有效避免驾驶疲劳?,连续驾驶不超过4小时,用餐不宜过饱,保持良好的睡眠,餐后适当休息后驾车,1234,,
驾驶汽车从支线道路怎样安全汇入主干道车流?,提前开启左转向灯,仔细观察主干道内情况,确认安全后汇入车流,加速直接汇入车流,123,,
这个小型客车驾车人有哪些违法行为?,接打手持电话,无证驾驶,酒后驾驶,未系安全带,1234,car_2.gif,
行车中驾驶人接打手机或发短信有什么危害?,影响乘车人休息,分散驾驶注意力,影响正常驾驶操作,遇紧急情况反应不及,234,,

2个相关的图片如下:

202111111126119153895.gif

202111111443103775250.gif


  全部代码如下:

from tkinter import *
import webbrowser

def wb98():
    webbrowser.open('http://www.wb98.com',new=1)

root = Tk()
root.title('何老师做的答题系统 wb98.com')
te1 = Text(root, cursor='arrow', width=10, height=15) # 创建多行文本框组件
te1.pack(side='left', fill=BOTH, expand=True)

with open('car3.txt', 'r', encoding='utf-8') as file:  # 只读方式打开编码为utf-8的题库文本文件
    number = 0  # 文本文件中的行号,即
    line = file.readlines()  # 以读取一行为列表方法读取全部行,line为分解好的列表内容
    str1 = line[0].split(',')  # 以英文,号来分解第1行,获取题目,答案1,答案2......

# str1[0]:题目  str1[1]:选项1  str1[2]:选项2  str1[3]:选项3  str1[4]:选项4
# str1[5]:答案  str1[6]:图片名

img = dict()  # 设img为一个空字典,用于循环地创建各题目的插图

# 以下设各变量为字典,便于循环时生成各组件插入Text组件
option1 = dict()  # 答案选项1
option2 = dict()  # 答案选项2
option3 = dict()  # 答案选项3
option4 = dict()  # 答案选项4

# 以下设各变量为字典,便于循环时绑定各组件的 variable 参数
var_ra = dict()
var_ch1 = dict()
var_ch2 = dict()
var_ch3 = dict()
var_ch4 = dict()
str_daan = ''  # 答案字符串初始化

# 以下是循环出题的代码 ------------------
for i in range(1, 11): # 通过循环插入题目,插图,答案选项

    id = str(number+1)+". "  # 题目序号
    te1.insert(END, id+str1[0]+'\n') # 插入题目

    if str1[6] == '':
        img[i] = PhotoImage()  # 没有相关图片
    else:
        img[i] = PhotoImage(file='.\\image\\'+str1[6])  # 图片是在安装目录下的image文件夹里
        te1.image_create(END, image=img[i]) # 插入相关插图
        te1.insert(END, '\n') # 插入一个分隔行

    str_daan = str_daan + str1[5]+','  # 把答案记下来,保存到一个以,号相分割的字符串里,交卷用于核对

    # 由答案的字符长度判断是单选题还是多选题,分别插入答案选项
    if len(str1[5]) == 1:  # 单选题
        var_ra[i] = IntVar(value=0)
        option1[i] = Radiobutton(root, text='A. '+str1[1], bg='white',
                                 activebackground='white', variable=var_ra[i], value=1)
        te1.window_create(END, window=option1[i])
        te1.insert(END, '\n')

        option2[i] = Radiobutton(root, text='B. '+str1[2], bg='white',
                                 activebackground='white', variable=var_ra[i], value=2)
        te1.window_create(END, window=option2[i])
        te1.insert(END, '\n')

        option3[i] = Radiobutton(root, text='C. '+str1[3], bg='white',
                                 activebackground='white', variable=var_ra[i], value=3)
        te1.window_create(END, window=option3[i])
        te1.insert(END, '\n')

        option4[i] = Radiobutton(root, text='D. '+str1[4], bg='white',
                                 activebackground='white', variable=var_ra[i], value=4)
        te1.window_create(END, window=option4[i])
        te1.insert(END, '\n')
    else:
        var_ch1[i] = BooleanVar(value=False)
        var_ch2[i] = BooleanVar(value=False)
        var_ch3[i] = BooleanVar(value=False)
        var_ch4[i] = BooleanVar(value=False)

        option1[i] = Checkbutton(
            root, text='A. '+str1[1], bg='white', activebackground='white', variable=var_ch1[i])
        te1.window_create(END, window=option1[i])
        te1.insert(END, '\n')

        option2[i] = Checkbutton(
            root, text='B. '+str1[2], bg='white', activebackground='white', variable=var_ch2[i])
        te1.window_create(END, window=option2[i])
        te1.insert(END, '\n')

        option3[i] = Checkbutton(
            root, text='C. '+str1[3], bg='white', activebackground='white', variable=var_ch3[i])
        te1.window_create(END, window=option3[i])
        te1.insert(END, '\n')

        option4[i] = Checkbutton(
            root, text='D. '+str1[4], bg='white', activebackground='white', variable=var_ch4[i])
        te1.window_create(END, window=option4[i])
        te1.insert(END, '\n')

    te1.insert(END, '\n')
    number = number+1
    str1 = line[number].split(',')  # 读取新一行记录
# 以上是循环出题的代码----------------------

te1.insert(END, '\n\n\n')


def dafei(): # 核对答案 函数
    daan = str_daan.split(',')  # 把答案字符串分解

    for i in range(1, 11):  # 单选题
        if len(daan[i-1]) == 1:  # 单选题
            if daan[i-1] == str(var_ra[i].get()):
                print('第'+str(i)+"题回答正确")
            else:
                print('第'+str(i)+"题回答错误")
                print("    正确答案:" + daan[i-1])
                print("    你的答案:" + str(var_ra[i].get()))
        else:  # 多选题
            duo = ''
            if var_ch1[i].get() == True:
                duo = '1'
            if var_ch2[i].get() == True:
                duo = duo+'2'
            if var_ch3[i].get() == True:
                duo = duo+'3'
            if var_ch4[i].get() == True:
                duo = duo+'4'

            if daan[i-1] == duo:
                print('第'+str(i)+"题回答正确")
            else:
                print('第'+str(i)+"题回答错误")
                print("    正确答案:" + daan[i-1])
                print("    你的答案:" + duo)


but1 = Button(root, text="    立 即 交 卷    ", command=dafei)  # 交卷打分
te1.window_create(END, window=but1)
but2 = Button(root, text="    访 问 官 网    ", command=wb98)  
te1.window_create(END, window=but2)



te1['state'] = DISABLED

scr1 = Scrollbar(root)  # 垂直滚动条
scr1.pack(side='right', fill=Y)

te1.config(yscrollcommand=scr1.set)  # 绑定滚动条
scr1.config(command=te1.yview)

root.geometry('700x650+555+111')  # 窗体启动的初始大小

root.mainloop()

运行结果

未命名.GIF

以上代码在 window10下 测试成功

此文章来自:wb98.com  网站还有相关的系列课程文章,感兴趣的可以前往。


打赏 支付宝打赏 微信打赏

来源:济亨网

本文链接:https://wb98.com/post/344.html

    << 上一篇 下一篇 >>

    湘公网安备 43011102000514号 - 湘ICP备08100508号