python-mysql期末实验:七、student_num(考生人数)表的增删改查界面以及数据可视化的制作

本专栏目录:

一、实验综述

二、基于MySQL进行的数据库的搭建

三、程序登录、注册界面的制作

四、数据导入界面的制作

五、collage(大学)表的增删改查界面的制作

六、province(省份)表的增删改查界面的制作

七、student_num(考生人数)表的增删改查界面以及数据可视化的制作(即本篇)

八、min_score_line(最低分数线)表的增删改查界面以及数据可视化的制作

九、collage_level(学校等级)表的增删改查界面的制作

十、enrollment_type(招生类型)表的增删改查界面的制作

十一、enrollment(招生人数)表的增删改查界面以及数据可视化的制作

十二、school_type(学校类型)表的增删改查界面的制作

十三、collage_school_level(各高校等级)表的增删改查界面的制作

十四、collage_province_enrollment_type(各高校招生类型)表的增删改查界面的制作

如果需要整个代码文件,以及数据库中的数据,或者有较为复杂的问题,请添加QQ:3095631599(CSDN-山河之书),添加时请备注:CSDN。

本部分将叙述考生人数增删改查函数(即本专栏第三篇文章中的student_num_use函数)的制作过程。

这部分主要包括一个界面:student_num表增删改查界面

可以实现的功能包括:支持关键词搜索,支持多元组查询,支持不完全关键词查询(即关键词有多个,可以只输入任意一个检索出符合其的全部结果),支持模糊关键词查询,支持无筛选条件的全表查询,支持单个元组的删除和插入,支持输入数据字符类型检查,支持插入或删除数据的完整性检查,支持查询数据的三维动态可视化。

接下来将舞台交给代码段,所有的解释都将以注释的形式呈现(注释是增量注释):

import tkinter as tk  # 本代码段需用
import pymysql as py  # 本代码段需用
import matplotlib.pyplot as plt  # 本代码段需用
from mpl_toolkits.mplot3d import Axes3D  # 本代码段需用
from tkinter import ttk  # 本代码段需用
from tkinter import messagebox  # 本代码段需用
import re  # 本代码段需用
import turtle
import random
import time


ip = "127.0.0.1"  # 本地地址


def student_num_use():
    student_num_window = tk.Tk()
    student_num_window.title("student_num表(考生人数表)操作界面")
    student_num_window.geometry("450x300")
    tk.Label(student_num_window, text="高校报考信息查询系统").place(x=300, y=20)

    tree = ttk.Treeview(student_num_window)
    tree["column"] = ("province_name", "year", "student_in_total")
    tree.column("province_name", width=120)
    tree.heading("province_name", text="省份名全称")
    tree.column("year", width=60)
    tree.heading("year", text="年份")
    tree.column("student_in_total", width=120)
    tree.heading("student_in_total", text="考生总人数")
    tree.grid(row=5, column=0, columnspan=20)

    province_name = tk.Label(student_num_window, text="省份名(关键字)")
    province_name.grid(row=1, column=0)
    province_name_str = tk.StringVar()
    province_name_input = tk.Entry(student_num_window, width=20, textvariable=province_name_str)
    province_name_input.grid(row=1, column=1)

    year = tk.Label(student_num_window, text="年份(关键字)")
    year.grid(row=2, column=0)
    year_str = tk.StringVar()
    year_input = tk.Entry(student_num_window, width=20, textvariable=year_str)
    year_input.grid(row=2, column=1)

    student_in_total = tk.Label(student_num_window, text="考生总人数")
    student_in_total.grid(row=3, column=0)
    student_in_total_str = tk.StringVar()
    student_in_total_input = tk.Entry(student_num_window, width=20, textvariable=student_in_total_str)
    student_in_total_input.grid(row=3, column=1)

    def select():
        province_name_info = province_name_input.get()
        year_info = year_input.get()
        conn = py.connect(host='%s' % ip, user='lzx', password='lzx', port=3306, database='dbms_report',
                          charset='utf8')
        cursor = conn.cursor()
        if len(province_name_info) == 0 and len(year_info) != 0:
            cursor.execute("select * from student_num where year=%d" % int(year_info))
        elif len(province_name_info) != 0 and len(year_info) == 0:
            cursor.execute("select * from student_num where province_name like '%%%s%%'" % province_name_info)
        elif len(province_name_info) == 0 and len(year_info) == 0:
            cursor.execute("select * from student_num")
        else:
            cursor.execute("select * from student_num where province_name like '%%%s%%' and year=%d"
                           % (province_name_info, int(year_info)))
        list_result = cursor.fetchall()
        x = tree.get_children()
        for item in x:
            tree.delete(item)
        a = []
        x = []
        y = []
        z = []
        for i in range(len(list_result)):
            tree.insert("", i, text=str(i), values=(list_result[i][0], list_result[i][1], list_result[i][2]))
            a.append(list_result[i][0])  # 数据预处理
            y.append(int(list_result[i][1]))  # 数据获取
            catch_z1 = list_result[i][2]
            catch_z2 = float(catch_z1[0:-1])  # 由于原数据中有单位万,这里删除此单位便于绘图
            z.append(catch_z2)
        for i in range(len(a)):
            x.append(i+1)  # 文字数据转成数字,便于绘制文字坐标轴
        picture = plt.figure(figsize=(200, 100))  # 建立坐标系并设置画布大小
        ax3d = Axes3D(picture)  # 建立三维绘图区
        plt.xticks(x, labels=a, fontfamily="SimHei")  # 坐标轴替换
        plt.yticks(y)
        ax3d.set_xlabel("省份名全称", fontfamily="SimHei")
        ax3d.set_ylabel("年份", fontfamily="SimHei")
        ax3d.set_zlabel("考生人数(单位:万人)", fontfamily="SimHei")  # 坐标轴设置
        ax3d.scatter(x, y, z, c='b', marker='*')  # 绘制点图
        plt.show()  # 展示图像
        conn.commit()
        conn.close()

    def insert():
        try:
            province_name_info = province_name_input.get()
            year_info = int(year_input.get())
            student_in_total_info = student_in_total_input.get()
            conn = py.connect(host='%s' % ip, user='lzx', password='lzx', port=3306, database='dbms_report',
                              charset='utf8')
            cursor = conn.cursor()
            try:
                cursor.execute("insert into student_num values('%s',%d,'%s')"
                               % (province_name_info, year_info, student_in_total_info))
                conn.commit()
                tk.messagebox.showinfo("正确", "数据插入成功")
                conn.close()
            except py.err.IntegrityError:
                tk.messagebox.showerror("错误", "受到完整性约束限制,数据插入失败,请重新检查数据,然后插入")
        except ValueError:
            tk.messagebox.showerror("错误", "年份需为整数")

    def delete():
        try:
            province_name_info = province_name_input.get()
            year_info = year_input.get()
            conn = py.connect(host='%s' % ip, user='lzx', password='lzx', port=3306, database='dbms_report',
                              charset='utf8')
            cursor = conn.cursor()
            try:
                if len(province_name_info) == 0 or len(year_info) == 0:
                    tk.messagebox.showerror("错误", "请输入两个执行删除的筛选条件")
                else:
                    cursor.execute("delete from student_num where province_name='%s' and year=%d"
                                   % (province_name_info, int(year_info)))
                    conn.commit()
                    tk.messagebox.showinfo("正确", "删除数据成功")
                conn.close()
            except py.err.IntegrityError:
                tk.messagebox.showerror("错误", "受到完整性约束限制,数据删除失败,请先删除外键数据")
        except ValueError:
            tk.messagebox.showerror("错误", "年份需为整数")

    tk.Button(student_num_window, text="查询", command=select).grid(row=4, column=0)
    tk.Button(student_num_window, text="插入", command=insert).grid(row=4, column=1)
    tk.Button(student_num_window, text="删除", command=delete).grid(row=4, column=2)

    def quit_student_num_use():
        student_num_window.destroy()
    tk.Button(student_num_window, text="返回", command=quit_student_num_use).grid(row=4, column=3)

喜闻乐见的运行截图:

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是对于web和mysql连接并增删改查的简单实现过程: 1.建立数据库和格: 首先,我们需要在mysql中建立一个数据库和相关的格,可以使用如下语句: ```sql CREATE DATABASE mydb; USE mydb; CREATE TABLE user ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL, age INT(3) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); ``` 这里我们创建了一个名为mydb的数据库,以及一个名为user的格,包含了id、name、age、email和reg_date五个字段。 2.连接数据库: 在web应用中,我们需要使用一个合适的编程语言(如PHP、Java、Python等)来连接和操作mysql数据库。这里以PHP为例,使用mysqli扩展来连接数据库: ```php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "mydb"; $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } ``` 这里我们连接了本地的mysql服务器,并使用$username和$password来验证身份,$dbname指定了要连接的数据库名称。如果连接失败,会输出错误信息并终止脚本运行。 3.实现增删改查: 接下来,我们可以使用SQL语句来实现增删改查操作。以查询所有用户的数据为例: ```php $sql = "SELECT * FROM user"; $result = $conn->query($sql); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Age: " . $row["age"]. " - Email: " . $row["email"]. " - Reg Date: " . $row["reg_date"]. "<br>"; } } else { echo "0 results"; } ``` 这里我们使用SELECT语句来查询user格的所有数据,并通过fetch_assoc()方法来逐行读取结果集。如果结果集为空,则输出"0 results"。 除了SELECT语句外,我们还可以使用INSERT、UPDATE和DELETE语句来实现数据的增加、修改和删除操作。以插入一条新用户数据为例: ```php $name = "Tom"; $age = 25; $email = "tom@example.com"; $sql = "INSERT INTO user (name, age, email) VALUES ('$name', '$age', '$email')"; if ($conn->query($sql) === TRUE) { echo "New record created successfully"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } ``` 这里我们使用INSERT语句来向user格中插入一条新数据,其中$name、$age和$email分别为要插入的姓名、年龄和邮箱。如果插入成功,则输出"New record created successfully"。 其他的修改和删除操作类似,这里不再赘述。 4.关闭数据库连接: 最后,我们需要在web应用结束时关闭数据库连接,以释放资源: ```php $conn->close(); ``` 以上就是一个简单的web和mysql连接并增删改查的实现过程。当然,实际应用中还需要考虑很多其他的因素,如安全性、性能优化等,这里不再讨论。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山河之书Liu_Zixin

不要打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值