Python GUI tkinter 随机生成题目

简介: 说明(1)拟设计的功能及实现思路、需要用到的知识实现逐个显示题目,并且在点击按钮之后判断回答是否正确实现可以统计正确率(在回答完所有题目之后)实现指定题目的数量,指定题目的运算符号实现将所有题目进行记录,并打印到word文档实现将所有错误的题目进行记录,并打印到word文档实现指定打印题目的行数和列数,并在界面进行展示实现时刻提醒用户当前还剩下多少个题目没有解决(2)调用库的说明random 生成随机数要用到的库tkinter 制作图形化界面要用到的库docx 对word文档进行操作的库docx.shared 里面的Pt 可以规定word文档的字体等规范

说明


(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 获取用户输入的题目的总数量


运行截图


以固定解决四个题为例

在输入题目的数量并且点击确定数量之后:

20210626172422998.png


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

如果答案正确:


20210626172510430.png


会提示用户回答正确

点几下一个题之后进入下一个题目:


20210626172523597.png


此时提示变成了还剩下三道题没有解决

输入错误的答案然后点击确定之后:


2021062617254539.png


这是会提醒用户回答错误

按照以上步骤继续回答正确一道题,回答错误一道题:


20210626172557477.png

20210626172606719.png


当所有的问题都回答完毕之后,会提示:


20210626172616504.png


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

此时会出现一个新的窗口:


20210626172635524.png


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

点击将所有题目打印到word之后:

可以看到所有的题目的保存情况:


202106261726511.png


题目被保存到 allProblem.docx

具体的保存形式如以下代码所示

style = document.styles[‘Normal’]

font = style.font

font.size = Pt(10)

在点击将所有错误题目打印到word之后:


20210626172702721.png


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

点击将所有题目展示在界面之后:


20210626172715808.png


会出现如上图所示的界面

默认的列数为两列

当用户输入要打印的行数和列数之后:(假定为两行两列)


20210626172727875.png


点击确认行和列,会有如下效果:

所有的题目被按照两行两列的形式展示在一个新的界面:


20210626172742746.png


如果按照四行一列的形式进行打印的话,会有如下界面:


20210626172751282.png


一个新的界面产生:


20210626172758321.png


在点击展示所有错误题目到界面之后:

会出现以上所述同款界面:


2021062617280956.png


确认一行两列之后:


20210626172818735.png


出现两行一列之后:


20210626172825208.png


代码


# 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入门技能树桌面应用开发Tkinter51952 人正在系统学习中

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
3天前
|
Python
python tkinter 最简洁的计算器按钮排列
python tkinter 最简洁的计算器按钮排列
16 0
|
3天前
|
存储 机器学习/深度学习 数据安全/隐私保护
Python GUI 设计的一个简单例子
Python GUI 设计的一个简单例子
13 1
|
3天前
|
存储 SQL 缓存
阿里云大学考试python中级题目及解析-python中级
阿里云大学考试python中级题目及解析-python中级
23 0
|
3天前
|
开发框架 程序员 开发者
Python GUI编程:从入门到精通3.2 GUI编程:学习使用Tkinter、PyQt或wxPython等库创建图形用户界面。
Python GUI编程:从入门到精通3.2 GUI编程:学习使用Tkinter、PyQt或wxPython等库创建图形用户界面。
|
3天前
|
存储 SQL 数据库
【python】python鲜花管理系统(界面GUI版本)(源码+数据库)【独一无二】
【python】python鲜花管理系统(界面GUI版本)(源码+数据库)【独一无二】
|
3天前
|
安全 数据安全/隐私保护 Python
292: 程序设计C 实验五 题目三 设计密码(python)
292: 程序设计C 实验五 题目三 设计密码(python)
|
3天前
|
Python
python使用tkinter库,封装操作excel为GUI程序
python使用tkinter库,封装操作excel为GUI程序
255 0
|
3天前
|
存储 前端开发 JavaScript
强烈推荐一个Python库!制作Web Gui也太简单了!
强烈推荐一个Python库!制作Web Gui也太简单了!
|
3天前
|
API 开发工具 C++
Python图形用户界面(GUI)编程:大解密
Python图形用户界面(GUI)编程:大解密
106 0
|
3天前
|
安全 UED Python
Python中使用Tkinter和Difflib模块实现文本比对功能
Python中使用Tkinter和Difflib模块实现文本比对功能
24 0