第二次作业
[实验目的]
1.掌握软件开发的基本流程
2.掌握常用的软件开发方式和工具。
[实验内容]
1.设计一个包含登录界面的计算器软件,该软件可以实现第一次作业中的全部功能,同时可以保存用户的历史计算记录(保存数据最好使用数据库)。
[实验要求]
1.完成软件的UI设计、使用Visio设计软件中所涉及的所有流程图。
2.选择合适的集成开发环境和工具完成计算器软件的开发
3.将开发好软件进行测试并截图
4.将本次实验过程写成实验报告提交在本次作业的链接中
5.关键代码部分以代码块格式粘贴在实验报告正文中
6.软件架构以及开发技术不限
7.本次作业为个人作业,发现雷同作业一律按0分处理。
一.登录页面
1.程序流程图

2.测试截图


loginPage.py
3.代码部分
import tkinter as tk
from tkinter import messagebox
from db import db
from CalculatorPage import CalPage
class LoginPage:
def __init__(self, master):
self.root = master
self.root.geometry('300x180')
self. root.title('登录页')
self.username = tk.StringVar()
self.password = tk.StringVar()
self.page = tk.Frame(root)
self.page.pack()
tk.Label(self.page).grid(row=0, column=0)
tk.Label(self.page, text='账户:').grid(row=1, column=1)
tk.Entry(self.page, textvariable=self.username).grid(row=1, column=2)
tk.Label(self.page, text='密码:').grid(row=2, column=1)
tk.Entry(self.page, textvariable=self.password).grid(row=2, column=2)
tk.Button(self.page, text='登录', command=self.login).grid(row=3, column=1, pady=10)
tk.Button(self.page, text='退出', command=self.page.quit).grid(row=3, column=2)
root.mainloop()
# 获取登录信息
def login(self):
name = self.username.get()
pwd = self.password.get()
flag, message = db.check_login(name, pwd)
if flag:
self.page.destroy()
CalPage(self.root)
else:
messagebox.showwarning(title='警告', message='登录失败,请检查账号密码是否正确')
# 测试用例
if __name__ == '__main__':
root = tk.Tk()
LoginPage(master=root)
二.计算器页面
1.程序流程图

2.测试截图
加法

减法

乘法

除法

求根

3.代码部分
CalculatorPage.py
import tkinter as tk
from db import db
class CalPage:
def __init__(self, master:tk.Tk):
self.root = master
self.root.title("计算器")
self.root.geometry('295x280+100+100')
self.root.attributes("-alpha", 0.9)
self.root["background"] = "#ffffff"
font = ('宋体', 20)
font_16 = ('宋体', 16)
result_num = tk.StringVar()
result_num.set('')
tk.Label(self.root, textvariable=result_num, font=font, height=2,
width=20, justify=tk.LEFT, anchor=tk.SE
).grid(row=1, column=1, columnspan=4)
def clear():
result_num.set("")
def click_button(x):
result_num.set(result_num.get() + x)
def calculate():
try:
expression = result_num.get()
result = eval(expression)
stu = {"process": expression, "result": result}
result_num.set(result)
# 数据插入数据库
db.insert(stu)
except Exception as e:
result_num.set("错误")
def newton_sqrt():
try:
number = float(result_num.get())
if number >= 0:
guess = number
while abs(guess * guess - number) > 1e-9:
guess = (guess + number / guess) / 2
result_num.set(guess)
else:
result_num.set("无效输入")
except ValueError:
result_num.set("错误")
#第一行
button_clear = tk.Button(self.root, text='C', width=5, font=font_16, relief=tk.FLAT, bg='#b1b2b2')
button_back = tk.Button(self.root, text='√', width=5, font=font_16, relief=tk.FLAT, bg='#b1b2b2')
button_div = tk.Button(self.root, text='/', width=5, font=font_16, relief=tk.FLAT, bg='#b1b2b2')
button_mul = tk.Button(self.root, text='x', width=5, font=font_16, relief=tk.FLAT, bg='#b1b2b2')
button_clear.grid(row=2, column=1, padx=4, pady=2)
button_back.grid(row=2, column=2, padx=4, pady=2)
button_div.grid(row=2, column=3, padx=4, pady=2)
button_mul.grid(row=2, column=4, padx=4, pady=2)
#第二行
button_seven = tk.Button(self.root, text='7', width=5, font=font_16, relief=tk.FLAT, bg='#eacda1')
button_eight = tk.Button(self.root, text='8', width=5, font=font_16, relief=tk.FLAT, bg='#eacda1')
button_nine = tk.Button(self.root, text='9', width=5, font=font_16, relief=tk.FLAT, bg='#eacda1')
button_sub = tk.Button(self.root, text='-', width=5, font=font_16, relief=tk.FLAT, bg='#b1b2b2')
button_seven.grid(row=3, column=1, padx=4, pady=2)
button_eight.grid(row=3, column=2, padx=4, pady=2)
button_nine.grid(row=3, column=3, padx=4, pady=2)
button_sub.grid(row=3, column=4, padx=4, pady=2)
#第三行
button_four = tk.Button(self.root, text='4', width=5, font=font_16, relief=tk.FLAT, bg='#eacda1')
button_five = tk.Button(self.root, text='5', width=5, font=font_16, relief=tk.FLAT, bg='#eacda1')
button_six = tk.Button(self.root, text='6', width=5, font=font_16, relief=tk.FLAT, bg='#eacda1')
button_add = tk.Button(self.root, text='+', width=5, font=font_16, relief=tk.FLAT, bg='#b1b2b2')
button_four.grid(row=4, column=1, padx=4, pady=2)
button_five.grid(row=4, column=2, padx=4, pady=2)
button_six.grid(row=4, column=3, padx=4, pady=2)
button_add.grid(row=4, column=4, padx=4, pady=2)
#第四行
button_one = tk.Button(self.root, text='1', width=5, font=font_16, relief=tk.FLAT, bg='#eacda1')
button_two = tk.Button(self.root, text='2', width=5, font=font_16, relief=tk.FLAT, bg='#eacda1')
button_three = tk.Button(self.root, text='3', width=5, font=font_16, relief=tk.FLAT, bg='#eacda1')
button_equal = tk.Button(self.root, text='=', width=5, height=3,font=font_16, relief=tk.FLAT, bg='#b1b2b2')
button_one.grid(row=5, column=1, padx=4, pady=2)
button_two.grid(row=5, column=2, padx=4, pady=2)
button_three.grid(row=5, column=3, padx=4, pady=2)
button_equal.grid(row=5, column=4, padx=4, pady=2, rowspan=2)
#第五行
button_zero = tk.Button(self.root, text='0', width=12, font=font_16, relief=tk.FLAT, bg='#eacda1')
button_dot = tk.Button(self.root, text='.', width=5, font=font_16, relief=tk.FLAT, bg='#eacda1')
button_zero.grid(row=6, column=1, padx=4, pady=2, columnspan=2)
button_dot.grid(row=6, column=3, padx=4, pady=2)
button_one.config(command=lambda:click_button('1'))
button_two.config(command=lambda:click_button('2'))
button_three.config(command=lambda:click_button('3'))
button_four.config(command=lambda:click_button('4'))
button_five.config(command=lambda:click_button('5'))
button_six.config(command=lambda:click_button('6'))
button_seven.config(command=lambda:click_button('7'))
button_eight.config(command=lambda:click_button('8'))
button_nine.config(command=lambda:click_button('9'))
button_zero.config(command=lambda:click_button('0'))
button_add.config(command=lambda:click_button('+'))
button_sub.config(command=lambda:click_button('-'))
button_mul.config(command=lambda:click_button('*'))
button_div.config(command=lambda:click_button('/'))
button_equal.config(command=lambda:calculate())
button_clear.config(command=lambda:clear())
button_back.config(command=lambda:newton_sqrt())
# 测试用例
if __name__ == '__main__':
root = tk.Tk();
CalPage(root)
root.mainloop()
三.连接数据库存储数据
将计算结果存储至数据库,以及查询数据库中的user表,对登录用户进行判断.
测试截图



代码部分
db.py
import json
import mysql.connector
host = "localhost"
user = "root"
password = "cjt327723"
database = "caldata"
class MySqlDatabase:
def __init__(self):
self.connection = mysql.connector.connect(
host=host,
user=user,
password=password,
database=database
)
self.get_Userdata()
def get_Userdata(self):
# 创建游标
self.cursor = self.connection.cursor()
# 查询数据
self.cursor.execute("SELECT * FROM users")
self.result = self.cursor.fetchall()
def check_login(self, username, password):
for row in self.result:
# 解析json数据
json_data = row[1]
parsed_data = json.loads(json_data)
if username == parsed_data['username']:
if password == parsed_data['password']:
return True, '登录成功'
else:
return False, '登录失败,密码错误'
return False, '登录失败,用户不存在'
def insert(self, student):
# data_example = "INSERT INTO test (data) VALUES ('{\"process\": \"example1\", \"result\": example2}')"
data_example = "INSERT INTO result (data) VALUES ('{\"process\": \"example1\", \"result\": example2}')"
data_example = data_example.replace("example1", student['process'])
data_example = data_example.replace("example2", student['result'].__str__())
# 插入数据到result表
self.cursor.execute(data_example)
self.connection.commit()
db = MySqlDatabase()
# 测试用例
if __name__ == '__main__':
print(db.check_login('admin', '123456'))
stu = {"process": "1+1", "result": 205878047}
db.insert(stu)

浙公网安备 33010602011771号