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