基于CMMI的软件工程及实训指导—学习笔记(四)
今天还是继续做小学四则运算,是基于上一次的内容—【基于CMMI的软件工程及实训指导—学习笔记(三)】https://www.cnblogs.com/eLiOFanG/p/13703093.html,进一步优化和升级。
一、升级要求(四选一 )
- 功能升级
- 界面升级
- 性能升级
- 用不同语言写升级
二、本次升级内容
(一)将上一次的交互式做题变成题库系统,并进行题库性能升级
因为上次我做的事交互式的做题系统,本次就更改为题库系统。主要代码:
1 #四则运算函数 2 question = [] 3 result=[] 4 #分1-6年级 写运算函数 5 def Arithmetic1(): 6 sign=['+','-','×','÷'] 7 s=random.randint(0,1) 8 num1=random.randint(1,10) 9 num2=random.randint(1,10) 10 if s==0:#加法 11 result.append(num1+num2) 12 question.append(str(num1)+'+'+str(num2)+'= ') 13 elif s==1:#减法 14 num1, num2 = max(num1, num2), min(num1, num2) 15 result.append(num1-num2) 16 question.append(str(num1)+'-'+str(num2)+'= ')
1 def run(N,n): #N=年级,n=数量 2 print('输入所需要的题目数量') 3 N=int(N) 4 n=int(n) 5 m=0 6 if N==1: 7 while m<=(n-1): 8 Arithmetic1() 9 m=m+1 10 m=1 11 for item in question: 12 display_q.insert('end','第{}题:'.format(m)+item+'\n') 13 m=m+1 14 m=1 15 for item in result: 16 display_a.insert('end','第{}题答案:'.format(m)+str(item)+'\n') 17 m=m+1
(二)用python做题库系统的GUI界面
用python做GUI界面,主要用到的是python 的tkinter。关于窗口等界面的设置,可以搜索bilibili中的相关视频,这里也有一篇文章可以借鉴一下—【Python GUI之tkinter窗口视窗教程大集合】https://blog.csdn.net/ahilll/article/details/81531587
主要代码:
1 #创建窗口 2 window=Tk() 3 window.title("小学四则运算系统") #窗口名 4 window.geometry("850x700") #宽x高 5 6 #创建label 7 label1=Label(window,text="小学数学四则运算题库系统",font=('黑体',25)) 8 label2=Label(window,text='请输入年级:',font=20) 9 label3=Label(window,text='请输入想要的题目数量:',font=20) 10 label4=Label(window,text='本次题目如下:',font=20) 11 label5=Label(window,text='答案如下:',font=20) 12 13 #创建输入框 14 entry1=tk.Entry(window, show=None, font=14) # 显示成明文形式 15 entry2=tk.Entry(window, show=None, font=14) # 显示成明文形式 16 entry1.pack() 17 entry2.pack() 18 19 #创建题库显示框 20 display_q=tk.Text(window,width=30,height=15) 21 display_q.pack() 22 23 #创建答案显示框 24 display_a=tk.Text(window,width=30,height=15) 25 display_a.pack() 26 27 # 清除键框 28 def delete(display_q,display_a): 29 entry1.delete(0,'end') 30 entry2.delete(0,'end') 31 display_q.delete(1.0,tkinter.END) 32 display_a.delete(1.0,tkinter.END) 33 34 #创建按钮 35 button_deter=tk.Button(window, text='确定', width=8,height=1,font=20, command=lambda:run(entry1.get(),entry2.get())) 36 button_clear=tk.Button(window, text='清除', width=8,height=1,font=20,command=lambda:delete(display_q,display_a)) 37 button_deter.pack() 38 button_clear.pack() 39 40 #最后的参数描写 41 label1.place(relx=0.5,rely=0.1,anchor=CENTER) 42 label2.place(relx=0.5,rely=0.2,anchor=CENTER) 43 label3.place(relx=0.5,rely=0.3,anchor=CENTER) 44 label4.place(relx=0.1,rely=0.5) 45 label5.place(relx=0.6,rely=0.5) 46 button_deter.place(relx=0.4,rely=0.4,anchor=CENTER) 47 button_clear.place(relx=0.6,rely=0.4,anchor=CENTER) 48 entry1.place(relx=0.7,rely=0.2,anchor=CENTER) 49 entry2.place(relx=0.75,rely=0.3,anchor=CENTER) 50 display_q.place(relx=0.1,rely=0.55) 51 display_a.place(relx=0.6,rely=0.55) 52 53 window.mainloop()
三、完整代码(后续会传到github官网中)
1 # -*- coding: utf-8 -*- 2 """ 3 Created on Tue Sep 22 20:42:42 2020 4 @author: Elio 5 """ 6 import random 7 import profile 8 import time 9 from fractions import Fraction 10 import tkinter 11 from tkinter import * 12 import tkinter.messagebox 13 import tkinter as tk # 使用Tkinter前需要先导入 14 15 #四则运算函数 16 question = [] 17 result=[] 18 #分1-6年级 写运算函数 19 def Arithmetic1(): 20 sign=['+','-','×','÷'] 21 s=random.randint(0,1) 22 num1=random.randint(1,10) 23 num2=random.randint(1,10) 24 if s==0:#加法 25 result.append(num1+num2) 26 question.append(str(num1)+'+'+str(num2)+'= ') 27 elif s==1:#减法 28 num1, num2 = max(num1, num2), min(num1, num2) 29 result.append(num1-num2) 30 question.append(str(num1)+'-'+str(num2)+'= ') 31 32 def Arithmetic2(): 33 sign=['+','-','×','÷'] 34 s=random.randint(0,3) 35 num1=random.randint(1,10) 36 num2=random.randint(1,10) 37 if s==0:#加法 38 result.append(num1+num2) 39 question.append(str(num1)+'+'+str(num2)+'= ') 40 elif s==1:#减法 41 num1, num2 = max(num1, num2), min(num1, num2) 42 result.append(num1-num2) 43 question.append(str(num1)+'-'+str(num2)+'= ') 44 elif s==2:#乘法 45 result.append(num1*num2) 46 question.append(str(num1)+'x'+str(num2)+'= ') 47 elif s==3:#除法 48 result.append(num1/num2) 49 question.append(str(num1)+'÷'+str(num2)+'= ') 50 51 def Arithmetic3(): 52 sign=['+','-','×','÷'] 53 s=random.randint(0,3) 54 num1=random.randint(1,20) 55 num2=random.randint(1,20) 56 if s==0:#加法 57 result.append(num1+num2) 58 question.append(str(num1)+'+'+str(num2)+'= ') 59 elif s==1:#减法 60 num1, num2 = max(num1, num2), min(num1, num2) 61 result.append(num1-num2) 62 question.append(str(num1)+'-'+str(num2)+'= ') 63 elif s==2:#乘法 64 result.append(num1*num2) 65 question.append(str(num1)+'x'+str(num2)+'= ') 66 elif s==3:#除法 67 result.append(num1/num2) 68 question.append(str(num1)+'÷'+str(num2)+'= ') 69 70 def Arithmetic4(): 71 sign=['+','-','×','÷'] 72 s=random.randint(0,3) 73 num1=random.randint(1,99) 74 num2=random.randint(1,10) 75 if s==0:#加法 76 result.append(num1+num2) 77 question.append(str(num1)+'+'+str(num2)+'= ') 78 elif s==1:#减法 79 num1, num2 = max(num1, num2), min(num1, num2) 80 result.append(num1-num2) 81 question.append(str(num1)+'-'+str(num2)+'= ') 82 elif s==2:#乘法 83 result.append(num1*num2) 84 question.append(str(num1)+'x'+str(num2)+'= ') 85 elif s==3:#除法 86 result.append(num1/num2) 87 question.append(str(num1)+'÷'+str(num2)+'= ') 88 89 def Arithmetic5(): 90 sign=['+','-','×','÷','×','÷'] 91 s=random.randint(0,5) 92 num1=random.randint(1,99) 93 num2=random.randint(1,99) 94 num3=random.randint(1,20) 95 num4=random.randint(1,20) 96 num5=random.randint(1,20) 97 num6=random.randint(1,20) 98 if s==0:#加法 99 result.append(num1+num2) 100 question.append(str(num1)+'+'+str(num2)+'= ') 101 elif s==1:#减法 102 num1, num2 = max(num1, num2), min(num1, num2) 103 result.append(num1-num2) 104 question.append(str(num1)+'-'+str(num2)+'= ') 105 elif s==2:#乘法 106 num1=Fraction(num3,num4) 107 num2=Fraction(num5,num6) 108 result.append(num1*num2) 109 question.append(str(num1)+'x'+str(num2)+'= ') 110 elif s==3:#除法 111 num1=Fraction(num3,num4) 112 num2=Fraction(num5,num6) 113 result.append(num1/num2) 114 question.append(str(num1)+'÷'+str(num2)+'= ') 115 elif s==4:#整数乘法 116 result.append(num1*num2) 117 question.append(str(num1)+'x'+str(num2)+'= ') 118 elif s==5:#整数除法 119 result.append(num1/num2) 120 question.append(str(num1)+'÷'+str(num2)+'= ') 121 122 def Arithmetic6(): 123 sign=['+','-','×','÷','×','÷'] 124 s=random.randint(0,5) 125 num1=random.randint(1,199) 126 num2=random.randint(1,99) 127 num3=random.randint(1,20) 128 num4=random.randint(1,20) 129 num5=random.randint(1,20) 130 num6=random.randint(1,20) 131 if s==0:#加法 132 result.append(num1+num2) 133 question.append(str(num1)+'+'+str(num2)+'= ') 134 elif s==1:#减法 135 num1, num2 = max(num1, num2), min(num1, num2) 136 result.append(num1-num2) 137 question.append(str(num1)+'-'+str(num2)+'= ') 138 elif s==2:#乘法 139 num1=Fraction(num3,num4) 140 num2=Fraction(num5,num6) 141 result.append(num1*num2) 142 question.append(str(num1)+'x'+str(num2)+'= ') 143 elif s==3:#除法 144 num1=Fraction(num3,num4) 145 num2=Fraction(num5,num6) 146 result.append(num1/num2) 147 question.append(str(num1)+'÷'+str(num2)+'= ') 148 elif s==4:#整数乘法 149 result.append(num1*num2) 150 question.append(str(num1)+'x'+str(num2)+'= ') 151 elif s==5:#整数除法 152 result.append(num1/num2) 153 question.append(str(num1)+'÷'+str(num2)+'= ') 154 155 def run(N,n): #N=年级,n=数量 156 print('输入所需要的题目数量') 157 N=int(N) 158 n=int(n) 159 m=0 160 if N==1: 161 while m<=(n-1): 162 Arithmetic1() 163 m=m+1 164 m=1 165 for item in question: 166 display_q.insert('end','第{}题:'.format(m)+item+'\n') 167 m=m+1 168 m=1 169 for item in result: 170 display_a.insert('end','第{}题答案:'.format(m)+str(item)+'\n') 171 m=m+1 172 if N==2: 173 while m<=(n-1): 174 Arithmetic2() 175 m=m+1 176 m=1 177 for item in question: 178 display_q.insert('end','第{}题:'.format(m)+item+'\n') 179 m=m+1 180 m=1 181 for item in result: 182 display_a.insert('end','第{}题答案:'.format(m)+str(item)+'\n') 183 m=m+1 184 if N==3: 185 while m<=(n-1): 186 Arithmetic3() 187 m=m+1 188 m=1 189 for item in question: 190 display_q.insert('end','第{}题:'.format(m)+item+'\n') 191 m=m+1 192 m=1 193 for item in result: 194 display_a.insert('end','第{}题答案:'.format(m)+str(item)+'\n') 195 m=m+1 196 if N==4: 197 while m<=(n-1): 198 Arithmetic4() 199 m=m+1 200 m=1 201 for item in question: 202 display_q.insert('end','第{}题:'.format(m)+item+'\n') 203 m=m+1 204 m=1 205 for item in result: 206 display_a.insert('end','第{}题答案:'.format(m)+str(item)+'\n') 207 m=m+1 208 if N==5: 209 while m<=(n-1): 210 Arithmetic5() 211 m=m+1 212 m=1 213 for item in question: 214 display_q.insert('end','第{}题:'.format(m)+item+'\n') 215 m=m+1 216 m=1 217 for item in result: 218 display_a.insert('end','第{}题答案:'.format(m)+str(item)+'\n') 219 m=m+1 220 if N==6: 221 while m<=(n-1): 222 Arithmetic6() 223 m=m+1 224 m=1 225 for item in question: 226 display_q.insert('end','第{}题:'.format(m)+item+'\n') 227 m=m+1 228 m=1 229 for item in result: 230 display_a.insert('end','第{}题答案:'.format(m)+str(item)+'\n') 231 m=m+1 232 233 #创建窗口 234 window=Tk() 235 window.title("小学四则运算系统") #窗口名 236 window.geometry("850x700") #宽x高 237 238 #创建label 239 label1=Label(window,text="小学数学四则运算题库系统",font=('黑体',25)) 240 label2=Label(window,text='请输入年级:',font=20) 241 label3=Label(window,text='请输入想要的题目数量:',font=20) 242 label4=Label(window,text='本次题目如下:',font=20) 243 label5=Label(window,text='答案如下:',font=20) 244 245 #创建输入框 246 entry1=tk.Entry(window, show=None, font=14) # 显示成明文形式 247 entry2=tk.Entry(window, show=None, font=14) # 显示成明文形式 248 entry1.pack() 249 entry2.pack() 250 251 #创建题库显示框 252 display_q=tk.Text(window,width=30,height=15) 253 display_q.pack() 254 255 #创建答案显示框 256 display_a=tk.Text(window,width=30,height=15) 257 display_a.pack() 258 259 # 清除键框 260 def delete(display_q,display_a): 261 entry1.delete(0,'end') 262 entry2.delete(0,'end') 263 display_q.delete(1.0,tkinter.END) 264 display_a.delete(1.0,tkinter.END) 265 266 #创建按钮 267 button_deter=tk.Button(window, text='确定', width=8,height=1,font=20, command=lambda:run(entry1.get(),entry2.get())) 268 button_clear=tk.Button(window, text='清除', width=8,height=1,font=20,command=lambda:delete(display_q,display_a)) 269 button_deter.pack() 270 button_clear.pack() 271 272 #最后的参数描写 273 label1.place(relx=0.5,rely=0.1,anchor=CENTER) 274 label2.place(relx=0.5,rely=0.2,anchor=CENTER) 275 label3.place(relx=0.5,rely=0.3,anchor=CENTER) 276 label4.place(relx=0.1,rely=0.5) 277 label5.place(relx=0.6,rely=0.5) 278 button_deter.place(relx=0.4,rely=0.4,anchor=CENTER) 279 button_clear.place(relx=0.6,rely=0.4,anchor=CENTER) 280 entry1.place(relx=0.7,rely=0.2,anchor=CENTER) 281 entry2.place(relx=0.75,rely=0.3,anchor=CENTER) 282 display_q.place(relx=0.1,rely=0.55) 283 display_a.place(relx=0.6,rely=0.55) 284 285 window.mainloop()
四、代码打包成exe可执行程序
(一)win+R输入cmd,打开命令行窗口
(二)安装pyinstaller,指令:pip install pyinstaller(已安装可忽略)
(三)目录切换到需要打包的py文件的该层目录
(四)打包文件,pyinstaller -F xxx.py(xxx.py是需要打包的文件)(如下图:)

(五)到打包文件目录查看打包好的程序,其中有一个新增的dist文件,打开它,并执行里面的exe应用程序文件即可。(如下图:)

五、运行结果(如下图)

六、性能测试(如下图)

七、时间记录(如下图)
总结:本次升级所用时间主要还是用在了GUI界面的设计和方法查找上,所用的时间也较长。希望之后可以缩短编写代码的时间吧。

浙公网安备 33010602011771号