题目1: 加减乘除运算微系统题目:为巩固和提高初学加减乘除运算的学生数学方面的认知与运算能力,请使用Python语言的tkinter库资源,编写一个简单的GUI可视化的小程序,实现一个随机出题(30以内整数加减乘除法的算术题)、判题、打分的小程序。具体要求如下:【程序要求:】(1)应用tkinter库资源绘制生成图形界面窗口(大小:800600):界面元素包括:若干标签控件Label、若干文本框控件Entry、三个命令按钮控件Button,以及其它个性化所需的、你认为有用的相关控件元素。(2)标签控件Label、文本框控件Entry元素,功用为:学生姓名的输入与显示、学生学号的输入与显示的载体,以及题号、题目数字、运算符、等号、结果等相关内容输入或显示的载体;三个按钮文本提示内容分别为Button 1->“随机生成试题”、 Button 2-> “提交”、 Button 3-> “查看答案”。(3)引用随机库资源,通过随机函数产生30以内的随机数,进行加减乘除法题目设计,题目的个数要求10个,且简单的单步运算题目。如:5+8= 、7-3= 、 24= 、 5÷2= (除法结果为整数除即可)。(4)程序流程:学生在界面上输入自己的姓名、学号信息;点击“随机生成试题”按钮,首先对学生输入的姓名和学号进行判断,经过身份检查之后才可做题(可用字典类型模拟一个数据库,键值对设置为学号和姓名,可提前设定几组姓名学号数据)。如果输入的姓名或学号为空,则需使用messagebox弹出对话框窗口提示“请注意:姓名或学号不能为空”;如学号和姓名已存在于字典之中,可以对应,则自动生成10道简单的加减乘除运算题目;否则,弹出对话框窗口提示“姓名或学号有误,请重新输入!”;学生在每个题目对应的文本框中输入对应答案;答题结束之后,点击“提交”按钮,页面给出该学生的测试成绩(成绩为百分制);最后,可以点击“查看答案”按钮查看本次测试的正确答案。【注意:在“提交”按钮按下之前,“查看答案”按钮应该是灰色、不可用的状态才好。或者,如果没做完全部题目就点击“查看答案”按钮,则自动提交现有题目,并显示分数。】(5)当点击“提交”按钮时,根据实际答题情况给出成绩,并将本次测试页面的全部基础信息(含:学生信息/题目/结果/成绩等),存入磁盘文件【学生姓名 – 学生学号.txt】;多次运行此程序测试、做题,磁盘文件【学生姓名 – 学生学号.txt】根据测试时间,内容应能顺序记录追加(可正序,也可逆序);【注意:文件中不能只有最后一次的测试信息记录】(5)设计窗口中各种元素的布局,做到合理美观;不做统一要求,要求大家基本功能相同,但形式各异,彰显大家的个性与创意;如有意向,也可自行增添其他扩展功能;
# 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()