Python GUI tkinter 随机生成题目

Posted PushyTao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python GUI tkinter 随机生成题目相关的知识,希望对你有一定的参考价值。

说明

(1)拟设计的功能及实现思路、需要用到的知识

  1. 实现逐个显示题目,并且在点击按钮之后判断回答是否正确
  2. 实现可以统计正确率(在回答完所有题目之后)
  3. 实现指定题目的数量,指定题目的运算符号
  4. 实现将所有题目进行记录,并打印到word文档
  5. 实现将所有错误的题目进行记录,并打印到word文档
  6. 实现指定打印题目的行数和列数,并在界面进行展示
  7. 实现时刻提醒用户当前还剩下多少个题目没有解决

(2)调用库的说明

  1. random 生成随机数要用到的库
  2. tkinter 制作图形化界面要用到的库
  3. docx 对word文档进行操作的库
  4. docx.shared 里面的Pt 可以规定word文档的字体等规范

(3)定义及调用的函数及功能

定义的函数:

  1. getProblem 获取题目,随机生成一个题目
  2. check 检查用户输入的答案是否正确
  3. showAllProblemInPage 在界面展示所有的题目
  4. showWrongProblemInPage 在界面展示所有的错误题目
  5. printAllProblemInWord 将所有的题目打印到word文档
  6. printWrongProblemIntoWord 将所有的错误题目打印到word文档
  7. newWindow 打完所有的题目之后调用的函数,包含下一步的操作
  8. calCorrectRate 计算本次答题的正确率,并按照百分比的形式进行展示
  9. next 对应按钮下一题,在用户点击“下一题”按钮的时候使用该函数
  10. getNumber 获取用户输入的题目的总数量

运行截图

以固定解决四个题为例
在输入题目的数量并且点击确定数量之后:
在这里插入图片描述

会出现一个提示: 一共需要做的题的数量

如果答案正确:
在这里插入图片描述

会提示用户回答正确
点几下一个题之后进入下一个题目:
在这里插入图片描述

此时提示变成了还剩下三道题没有解决
输入错误的答案然后点击确定之后:
在这里插入图片描述

这是会提醒用户回答错误
按照以上步骤继续回答正确一道题,回答错误一道题:

在这里插入图片描述
在这里插入图片描述

当所有的问题都回答完毕之后,会提示:
在这里插入图片描述

所有题目都已经回答完毕,跳转打印界面ing

此时会出现一个新的窗口:
在这里插入图片描述

在这个答题信息显示及下载界面中,我们可以看到红色背景的部分为正确率

点击将所有题目打印到word之后:
可以看到所有的题目的保存情况:
在这里插入图片描述

题目被保存到 allProblem.docx
具体的保存形式如以下代码所示
style = document.styles[‘Normal’]
font = style.font
font.size = Pt(10)

在点击将所有错误题目打印到word之后:
在这里插入图片描述

可以发现所有的错误题目都被打印在wrongProblem.docx中

点击将所有题目展示在界面之后:
在这里插入图片描述

会出现如上图所示的界面
默认的列数为两列
当用户输入要打印的行数和列数之后:(假定为两行两列)
在这里插入图片描述

点击确认行和列,会有如下效果:
所有的题目被按照两行两列的形式展示在一个新的界面:
在这里插入图片描述

如果按照四行一列的形式进行打印的话,会有如下界面:
在这里插入图片描述

一个新的界面产生:
在这里插入图片描述

在点击展示所有错误题目到界面之后:
会出现以上所述同款界面:
在这里插入图片描述

确认一行两列之后:
在这里插入图片描述

出现两行一列之后:

在这里插入图片描述

代码

# from tkinter import *
import random
import tkinter as tk
from docx import Document
from docx.shared import Pt

correct = 0 #记录正确的数量
total = 0 #记录总数量
errorList = []
t_total = 0
allProblem = []

def getProblem():
    a = random.randint(1, 18)
    if a < 10:
        b = random.randint(10 - a, 9)
        c = a + b
        result = "%d  +  %d" % (a, b) #题目生成
        allProblem.append(result)
        # print(result)
        return (result, c)
    if a >= 10:
        b = random.randint(a - 9, 9)
        c = a - b
        result = "%d  -  %d" % (a, b) #题目生成
        allProblem.append(result)
        # print(result)
        return (result, c) #返回的题目 && 答案

def check():
    global t_total
    t_total -= 1
    if int(result.get()) == int(t[1]):
        global correct
        correct += 1
        h = "恭喜你!回答正确"
        hint.set(h)
    else:
        h = "糟糕!回答错误!"
        errorList.append(t[0]) #将错误的编号假加入 记录错误题目列表
        hint.set(h)
        result.set('') #设置为空串


def showAllProblemInPage(): # 在界面展示所有的题目
    # print('hello,world')
    var1 = len(allProblem) // 2
    var2 = 2
    def confirmRC():
        global var1, var2
        var1 = hang.get()
        var2 = lie.get()
        var1 = (int)(var1)
        var2 = (int)(var2) # print(var1) print(var2)
        disPlayWindow = tk.Tk()
        disPlayWindow.title('所有题目如下:')
        disPlayWindow.geometry('800x800+100+100')

        display = ''  # 展示的字符串
        cnt = 0
        for i in allProblem:
            cnt += 1
            if cnt % var2 != 0:
                display = display + i + '\\t' + '\\t'
            else:
                display = display + i + '\\n'
        lb = tk.Label(disPlayWindow, bg='pink', width=150, height=50)
        lb.config(text=display)
        lb.grid(row=1, column=1)
        # print(display)

    # 注意下行数和列数
    windowAllProblem = tk.Tk()
    windowAllProblem.title('所有题目展示界面')
    windowAllProblem.geometry('300x300+100+100')

    #行数列数标签放置
    l1 = tk.Label(windowAllProblem, text='行数:')
    l1.grid(row = 0)
    l2 = tk.Label(windowAllProblem, text='列数:')
    l2.grid(row = 1)

    hang = tk.Entry(windowAllProblem, show=None)
    hang.grid(row=0, column=1)
    lie = tk.Entry(windowAllProblem, show=None)
    lie.grid(row=1, column=1)
    # 行列放置完成
    confirmBtn = tk.Button(windowAllProblem, text='确认行和列', command=confirmRC)
    confirmBtn.grid(row=2, column=1)
    # 行数列数已经获取 :
    # var1 行数 var2 列数
    print(var1)
    print(var2)
    windowAllProblem.mainloop()


def showWrongProblemInPage(): #将所有错误题目在界面展示
    ## print('hello,world')
    var1 = len(errorList) // 2
    var2 = 2
    def confirmRC():
        global var1, var2
        var1 = hang.get()
        var2 = lie.get()
        var1 = (int)(var1)
        var2 = (int)(var2) # print(var1) print(var2)
        disPlayWindow = tk.Tk()
        disPlayWindow.title('所有题目如下:')
        disPlayWindow.geometry('800x800+100+100')

        display = ''  # 展示的字符串
        cnt = 0
        for i in errorList:
            cnt += 1
            if cnt % var2 != 0:
                display = display + i + '\\t' + '\\t'
            else:
                display = display + i + '\\n'
        lb = tk.Label(disPlayWindow, bg='pink', width=150, height=50)
        lb.config(text=display)
        lb.grid(row=1, column=1)
        # print(display)

    # 注意下行数和列数
    windowAllProblem = tk.Tk()
    windowAllProblem.title('所有题目展示界面')
    windowAllProblem.geometry('300x300+100+100')

    #行数列数标签放置
    l1 = tk.Label(windowAllProblem, text='行数:')
    l1.grid(row = 0)
    l2 = tk.Label(windowAllProblem, text='列数:')
    l2.grid(row = 1)

    hang = tk.Entry(windowAllProblem, show=None)
    hang.grid(row=0, column=1)
    lie = tk.Entry(windowAllProblem, show=None)
    lie.grid(row=1, column=1)
    # 行列放置完成
    confirmBtn = tk.Button(windowAllProblem, text='确认行和列', command=confirmRC)
    confirmBtn.grid(row=2, column=1)
    # 行数列数已经获取 :
    # var1 行数 var2 列数
    windowAllProblem.mainloop()
    print(var1)
    print(var2)

def printAllProblemInWord(): # 打印所有题目到word
    document = Document()
    paragraph = document.add_paragraph('所有的题目:\\n')
    for i in allProblem:
        paragraph.add_run(i + '\\n')

    print(len(allProblem))
    style = document.styles['Normal']
    font = style.font
    font.size = Pt(10)

    document.save('allProblem.docx')
    # return None

def printWrongProblemIntoWord(): #将所有错误题目打印到word
    document1 = Document()
    paragraph = document1.add_paragraph('所有错误的题目:\\n')
    for i in errorList:
        paragraph.add_run(i + '\\n')

    style = document1.styles['Normal']
    font = style.font
    font.size = Pt(10)

    document1.save('wrongProblem.docx')
    # return None

def newWindow():
    new_window = tk.Tk()
    new_window.title('答题信息显示及下载界面')
    new_window.geometry('300x300+100+100')

    info = tk.Label(new_window, bg='red', width=20)
    info.grid(row=0)
    info.config(text='the correct rate is ' + calCorrectRate() + '\\n')

    btn1 = tk.Button(new_window, text='将所有题目打印到word', command=printAllProblemInWord)
    btn1.grid(row=1, column=0)
    btn2 = tk.Button(new_window, text='展示所有题目到界面', command=showAllProblemInPage)
    btn2.grid(row=2, column=0)
    btn3 = tk.Button(new_window, text='将错误题目打印到word', command=printWrongProblemIntoWord)
    btn3.grid(row=3, column=0)
    btn4 = tk.Button(new_window, text='展示所有错误题目到界面', command=showWrongProblemInPage)
    btn4.grid(row=4, column=0)
    new_window.mainloop()

def calCorrectRate():
    global total, correct
    # 定义一下 正确率
    correct_rate = correct / total
    correct_rate = correct_rate * 100.0
    correct_rate = str(correct_rate) + ' %'
    return correct_rate


def next():
    global t, t_total
    if t_total == 0:
        l.config(text='所有题目都已经回答完毕, 跳转打印界面ing')
        # allProblem.pop()# 多余的题目删除掉(仅最后一个)
        # exit()函数在之后没有进行其他的操作
        newWindow()
        # exit() #! 记得改为别的函数
        # print('hello,world')
    l.config(text='一共需要做 ' + str(total) + ' 道题\\n' + '还剩' + str(t_total) + ' 道题\\n')
    t = getProblem()
    problem.set(t[0])
    result.set('')
    hint.set('')#判断的结果置为空

def getNumber():
    global total, t_total
    total = (int)(number.get())
    t_total = total
    # print(t_total) #输出总共的题目数量
    var1.set(total)
    # print(var1)
    l.config(text='一共需要做 ' + str(t_total) + ' 道题\\n')
    # print(total)

master = tk.Tk()
master.geometry('700x700+100+100')
master.title("加减进退位运算")
var1 = tk.StringVar() #定义一个变量
l = tk.Label(master, bg='yellow', width=30) # textvariable=var1,
l.grid(row=18) #放置在第18行
tk.Label(master, text='请输入数量:').grid(row=0) # 放置在第一行,这个框里面的是
tk.Label(master, text="题目").grid(row=1)
tk.Label(master, text="答案").grid(row=2)
tk.Label(master, text="信息").grid(row=5)

problem = tk.StringVar()
result = tk.StringVar()
hint = tk.StringVar() # 记录答案是否正确

number = tk.Entry(master, show=None)
number.grid(row=0, column=1)
# e0 = Entry(master, textvariable=)
e1 = tk.Entry(master, textvariable=problem) #题目显示
e2 = tk.Entry(master, textvariable=result) #答案框显示
e3 = tk.Entry(master, textvariable=hint) #结果显示

t = getProblem()
problem.set(t[0]) #作为题目problem
result.get()

e1.grid(row=1, column=1)
e2.grid(row=2, column=1)
e3.grid(row=5, column=1)

btn0 = tk.Button(master, text='确认数量', command=getNumber)
btn = tk.Button(master, text='确定', command=check) #执行 check函数
btn2 = tk.Button(master, text='下一题', command=next)#执行 下一个题
# 窗口放置
btn0.grid(row=0, column=4)
btn.grid(row=2, column=4)
btn2.grid(row=2, column=5)

master.mainloop()

以上是关于Python GUI tkinter 随机生成题目的主要内容,如果未能解决你的问题,请参考以下文章

丢弃 Tkinter!简单配置快速生成超酷炫 GUI!

tkinter模块常用参数(python3)

python GUI(Tkinter)

Python之GUI的最终选择(Tkinter)

Python GUI:tkinter

Python GUI:tkinter