python GUI界面编程 口算题生成系统

摘要:
问题描述口算问题生成系统功能:口算:在界面上显示问题,并逐一显示问题。用户可以通过输入框输入计算结果。该系统可以实时计算准确度,并将错误的问题打印到文件中。“+”的正确率为:“+str)update_num()e.deleteelse:result.set(”错误答案“+”正确率为

问题描述

口算题生成系统

功能:

(1)口算:题目显示在界面上(除法必须是整除),逐个显示题目,用户通过输入框输入计算结果。系统能实时统计正确率,将错误题目打印到文件里。
(2)生成题目:用户选择生成的题目数量,打印时的列数,运算符的数量,将题目生成到docx文件里。

设计说明

(1)拟设计的功能及实现思路、需要用到的知识
功能(1)的实现思路:
1.初始化窗口和幕布,为窗口命名
2.记录用到的变量,两个整数x、y,以及用到的符号op(+-*/)
3.将x,y,op打印到界面上,并且生成输入框
4.添加按钮,get_num表示生成题目,judge表示判断结果是否正确,print_error表示将所有错误题目打印到文件里
5.为get_num编写函数update_num,随机生成新的x、y、op
6.为judge编写函数judge,判断答案是否正确。由于除法要用整除来判断,而eval表达式判断的是非整除,加了个特判,当op=/时,特判答案是否正确。
7.编写函数save_error,保存错误的题目,在judge函数中使用,如果回答错误,就将错误题目的字符串形式保存到列表
8.记录变量cur_num表示正确题目的数量,sum表示一共回答问题的数量,每次都计算正确率打印到屏幕上
9.为print_error编写函数 output_error(),将错误题目打印到txt文件,一行一个题目。
10.增加键盘操作,用键盘回车代替判断按钮,免去了每次检验结果时需要鼠标操作的麻烦。
功能(2)的实现思路:
1.初始化窗口和幕布,为窗口命名
2.生成输入框和说明文字,统计用户想要生成的题数,用户想要使用操作符的个数,用户打印文件的列数。
3.设计按钮output,表示用户提交意愿
4.编写output_all函数,根据用户意愿获得相关信息
5.根据题目数量生成题目,以字符串格式保存到列表
6.调用docx相关库创建docx文件,判断表格的行数和列数,生成表格
7.从列表中读取信息到文件
8.保存文件到rex.docx
(2)调用库的说明
tkinter:GUI编程的相关库
random:随机数生成的相关库
(3)定义及调用的函数及功能
Tk():创建应用程序主窗口
Frame():创建控件容器,可依附在窗口中
IntVar(),StringVar():初始化变量
.Label():显示变量的标签
set()为变量重新赋值
randint():生成某一范围的随机数
get():获取变量的值
Button():设置按钮
bind():设置键盘快捷键
mainloop():循环
自己定义的函数
update_num() :产生新的题目,即新的随机的x,y和符号
save_error():#保存错误题目
output_error():#打印错误题目到文件
judge(event):判断答案是否正确
output_all():打印所有题目到docx文件

实现代码

功能(1)

# -*- coding: utf-8 -*-
"""
Created on Wed Jun 16 16:49:28 2021

@author: DELL
"""

#导入GUI的包,以及随机数的包
import tkinter as tk
import random
#初始化窗口和幕布
root = tk.Tk()
window = tk.Frame(root, bg ="lightgreen")
window.pack(expand = tk.YES,fill = tk.BOTH)
root.title('口算计算器')  #窗口名字

#初始化用到的变量,两个数x,y和符号sym,sym限定在加号和减号之间,可以添加乘除
x = tk.IntVar()
y = tk.IntVar()
sym = tk.StringVar()
#显示变量的标签
tk.Label(window,textvariable =x).grid(row = 0,column = 0)
tk.Label(window,textvariable =sym).grid(row = 0,column = 2,ipadx=10)
tk.Label(window,textvariable =y).grid(row = 0,column = 3,ipadx=10)


lst=[]
symbol = ['+','-','*','/'] # sym符号的池子
flag = 1
sum=0
cur_num=0
#此函数产生新的题目,即新的随机的x,y和符号
def update_num():
    global flag
    if flag:
        flag = 0
        x.set(random.randint(10,100))
        y.set(random.randint(10,100))
        sym.set(symbol[random.randint(0,3)])
    else:
        flag = 1
        x.set(random.randint(10, 100))
        y.set(random.randint(10, 100))
        sym.set(symbol[random.randint(0,3)])
    global sum
    sum=sum+1
def save_error():#保存错误题目
    c = str(x.get())+sym.get()+str(y.get())+"=
"
    lst.append(c)
def output_error():#打印错误题目到文件
    with open('error_题目.txt',mode='w',encoding='utf-8') as tf:
        for i in lst:
            tf.write(i)


tk.Button(window,text = 'gen_num', width = 10,height = 4,bg = 'blue', command = update_num).grid(row = 5,column = 10,sticky=tk.W)
tk.Button(window,text="print_error",width = 10,height = 4,bg = 'red',command=output_error).grid(row = 7,column = 10,sticky=tk.W)
# 生成输入框
e = tk.Entry(window)
e.grid(row = 0, column = 4)
result = tk.StringVar()

def judge(event):
    global cur_num
    c = str(x.get())+sym.get()+str(y.get())
    if len(e.get()) !=0:
        if(sym.get()=='/'):
            tx=int(x.get())
            ty=int(y.get())
            if(tx//ty==int(e.get())):
                cur_num=cur_num+1
                result.set("回答正确!"+"正确率为:"+str(cur_num/sum))
                update_num()
                e.delete(0,'end')
            else:
                result.set("回答错误"+"正确率为:"+str(cur_num/sum))
                save_error()
                update_num()
                e.delete(0, 'end')
        else:
            if int(e.get()) == eval(c):
                
                cur_num=cur_num+1
                result.set("回答正确!"+"正确率为:"+str(cur_num/sum))
                update_num()
                e.delete(0,'end')
            else:
                result.set("回答错误"+"正确率为:"+str(cur_num/sum))
                save_error()
                update_num()
                e.delete(0, 'end')
    else:
        result.set("请输入答案")

#键盘回车按键代替判断按钮,免去了每次检验结果时都需要鼠标操作的麻烦
root.bind('<Return>', judge)
button = tk.Button(window,text="judge",width = 10,height = 4,bg = 'pink')
button.grid(row = 6,column = 10)
button.bind('<Button-1>',judge)
tk.Label(window,textvariable =result).grid(row = 1,column = 0)

#敞口循环必须有
root.mainloop()

功能(2)



# -*- coding: utf-8 -*-
"""
Created on Wed Jun 16 17:35:59 2021

@author: DELL
"""
import tkinter as tk
import random
from docx import Document
root_all = tk.Tk()
window_all = tk.Frame(root_all, bg ="green")
window_all.pack(expand = tk.YES,fill = tk.BOTH)
root_all.title('生成题目')  #窗口名字
tk.Label(window_all,text='题目数量:').grid(row=0,column=0)
tk.Label(window_all,text='运算符个数:').grid(row=1,column=0)
tk.Label(window_all,text='打印到文件里的列数:').grid(row=2,column=0)



num = tk.Entry(window_all)
num.grid(row = 0, column = 1)
oper_num=tk.Entry(window_all)
oper_num.grid(row=1,column=1)
col_num=tk.Entry(window_all)
col_num.grid(row=2,column=1)

symbol = ['+','-','*','/']
lst=[]


def output_all():
    num_cnt=int(num.get())
    oper_cnt=int(oper_num.get())
    col_cnt=int(col_num.get())
    #print(type(num_cnt))
    for i in range(num_cnt):
        x=random.randint(10,100)
        y=random.randint(10,100)
        op=symbol[random.randint(0,oper_cnt-1)]
        c = str(x)+op+str(y)+"=      "
        lst.append(c)
    wordfile=Document()
    cnt_row=num_cnt//col_cnt
    if num_cnt % col_cnt == 0:
        cnt_row=cnt_row+1
    table=wordfile.add_table(rows=cnt_row,cols=col_cnt,)
    row_idx=0
    col_idx=0
    for i in lst:
       table.rows[row_idx].cells[col_idx].text=i
       col_idx=col_idx+1
       if col_idx == col_cnt  :
           col_idx=0
           row_idx=row_idx+1
    wordfile.save("res.docx")
tk.Button(window_all,text="output",width = 10,height = 4,bg = 'orange',command=output_all).grid(row = 8,column = 10,sticky=tk.W)

root_all.mainloop()

参考博客找到了加上

免责声明:文章转载自《python GUI界面编程 口算题生成系统》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇一个项目的记录:多人博客swiper横向轮播(兼容IE8)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java调用Python程序

最近,需要在应用中,需要使用Java程序去调用Python代码,主要有两种实现方式。 一、使用Jython架包 因为调用的Python代码中需要使用Json对象,开始使用jython2.5.2,发现不支持json。因此, 升级了最新的Jython2.7.0,发现可以支持。因此,要使用更多python库,建议使用更高版本的Jython包。 首先,添加Jyth...

pytorch中nn.RNN()总结

nn.RNN(input_size, hidden_size, num_layers=1, nonlinearity=tanh, bias=True, batch_first=False, dropout=0, bidirectional=False) 参数说明 input_size输入特征的维度, 一般rnn中输入的是词向量,那么 input_siz...

怎样编写NES模拟器

怎样写模拟器作者: Nikolas GavalasEmail: thundermahoney@hotmail.com 怎样写模拟器简介阶段读入运行获得 ROM 的操作码执行操作码执行中断读写内存做循环任务视频模拟声音模拟优化课程收获我的模拟器参考文献 +------+| 简介 |+------+ 模拟你喜欢的系统来玩游戏比你想象的要简单 (简单程度依赖于你...

Python中调用Linux命令并获取返回值

方法一、使用os模块的system方法:os.system(cmd),其返回值是shell指令运行后返回的状态码,int类型,0表示shell指令成功执行,256/512表示未找到,该方法适用于shell命令不需要输出内容的场景。 os.system(cmd)会启动子进程,在子进程中执行cmd,如果cmd有执行内容,会在标准输出显示。 举例说明: 1. 列...

python的文件操作1,监控日志联系、读取大文件、修改文件、集合、元组、random模块以及函数初识

一、判断 #非空即真,非零即真# 非空(None,'',[],{})都是空umser=input('请输入姓名').strip()if umser:print('umser不为空')else:print('umser为空')print(len(umser)>0)if 1:print('真')else:print('假') 一、文件读写 fw=op...

Linux下安装Python3.xx个人解析

一、环境准备 提示:在系统的任何目录下都可以进行如下环境配置操作。 1、 yum install openssl -y yum install openssl-devel -y   这两个文件的安装是为了配置pip3,没有这步操作,后续pip3可能出现错误:ImportError: cannot import name 'HTTPSHandler'  ...