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 人正在系统学习中

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
8月前
|
API C++ 开发者
PySide vs PyQt:Python GUI开发史诗级对决,谁才是王者?
PySide 和 PyQt 是 Python GUI 开发领域的两大利器,各有特色。PySide 采用 LGPL 协议,更灵活;PyQt 默认 GPL,商业使用需授权。两者背后团队实力雄厚,PySide 得到 Qt 官方支持,PyQt 由 Riverbank Computing 打造。API 设计上,PySide 简洁直观,贴近原生 Qt;PyQt 增加 Pythonic 接口,操作更高效。性能方面,两者表现优异,适合不同需求的项目开发。选择时可根据项目特点与开源要求决定。
860 20
|
测试技术 开发者 Python
Python(GUI)之活动积分记录表
本文介绍了一套使用Python的Tkinter库构建的学生活动积分记录系统。该系统允许教师选择班级和学生,输入加分分数及原因,并将数据保存至文件,旨在简化学生积分管理流程,提升教学效率。
281 6
|
11月前
|
人工智能 自然语言处理 程序员
体验通义灵码的AI程序员:用Python+Tkinter实现表单向config.ini写入与读取
本文介绍了如何利用通义灵码的AI程序员快速开发一个基于Python和Tkinter的表单应用程序,实现对config.ini文件的读写。通过简单的自然语言描述,通义灵码能自动生成代码框架、自动补全功能代码,并提供错误检测与修复建议,极大提高了开发效率。开发者只需安装必要库(如configparser)并配置VSCode插件TONGYI Lingma,即可轻松创建包含多个输入项和按钮的表单界面。运行程序后,用户可以编辑表单并保存数据到config.ini文件中,再次启动时数据会自动加载显示。这一过程展示了AI在编程中的高效性和灵活性,为开发者提供了全新的开发方式。
450 3
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
1024 7
|
前端开发 Python
python之【Tkinter模块】
python之【Tkinter模块】
287 5
|
Linux Android开发 开发者
【Python】GUI:Kivy库环境安装与示例
这篇文章介绍了 Kivy 库的安装与使用示例。Kivy 是一个开源的 Python 库,支持多平台开发,适用于多点触控应用。文章详细说明了 Kivy 的主要特点、环境安装方法,并提供了两个示例:一个简单的 Hello World 应用和一个 BMI 计算器界面。
665 0
|
机器学习/深度学习 算法框架/工具 Python
基于深度学习的手写数字识别项目GUI(Deep Learning Project – Handwritten Digit Recognition using Python)
基于深度学习的手写数字识别项目GUI(Deep Learning Project – Handwritten Digit Recognition using Python)
664 0
|
前端开发 JavaScript 测试技术
Python中的GUI测试
【8月更文挑战第15天】本文探讨了Python中图形用户界面(GUI)测试的关键工具——Selenium与PyQt。Selenium专为Web应用测试设计,能模拟用户行为如点击和输入文本。PyQt则基于Qt框架,用于构建丰富的桌面应用程序及编写自动化测试脚本。
|
Java C++ Python
【面试宝典】深入Python高级:直戳痛点的题目演示(下)
【面试宝典】深入Python高级:直戳痛点的题目演示(下)
|
设计模式 Unix Python
【面试宝典】深入Python高级:直戳痛点的题目演示(上)
【面试宝典】深入Python高级:直戳痛点的题目演示(上)

推荐镜像

更多