第二次作业

[实验目的]

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)
posted @ 2023-11-19 11:25  AuroraFish  阅读(107)  评论(0)    收藏  举报