Python GUI tkinter 随机生成题目
Posted PushyTao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python GUI tkinter 随机生成题目相关的知识,希望对你有一定的参考价值。
说明
(1)拟设计的功能及实现思路、需要用到的知识
- 实现逐个显示题目,并且在点击按钮之后判断回答是否正确
- 实现可以统计正确率(在回答完所有题目之后)
- 实现指定题目的数量,指定题目的运算符号
- 实现将所有题目进行记录,并打印到word文档
- 实现将所有错误的题目进行记录,并打印到word文档
- 实现指定打印题目的行数和列数,并在界面进行展示
- 实现时刻提醒用户当前还剩下多少个题目没有解决
(2)调用库的说明
- random 生成随机数要用到的库
- tkinter 制作图形化界面要用到的库
- docx 对word文档进行操作的库
- docx.shared 里面的Pt 可以规定word文档的字体等规范
(3)定义及调用的函数及功能
定义的函数:
- getProblem 获取题目,随机生成一个题目
- check 检查用户输入的答案是否正确
- showAllProblemInPage 在界面展示所有的题目
- showWrongProblemInPage 在界面展示所有的错误题目
- printAllProblemInWord 将所有的题目打印到word文档
- printWrongProblemIntoWord 将所有的错误题目打印到word文档
- newWindow 打完所有的题目之后调用的函数,包含下一步的操作
- calCorrectRate 计算本次答题的正确率,并按照百分比的形式进行展示
- next 对应按钮下一题,在用户点击“下一题”按钮的时候使用该函数
- 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 随机生成题目的主要内容,如果未能解决你的问题,请参考以下文章