tk模块构建一个简单的学生信息管理系统

1.创建数据库

(1)创建一个students和user数据库分别用来存储学生信息和用户信息。

终端输入mysql -u root -p 进入登入mysql,分别输入 :

create database students;  

create database user; 

创建students,user数据库

216302d8ea8748fca98eeccd418fce5d.png

(2)创建项目所需文件

db473dbe6e2b4c559563cb12f7a4146b.png

2. 连接数据库并创建数据表

user.py

连接user数据库并创建users数据表

import sqlite3

def init_database():
    conn = sqlite3.connect("user.db")
    c = conn.cursor()
    c.execute("CREATE TABLE IF NOT EXISTS users (user VARCHAR(20) PRIMARY KEY, password VARCHAR(20))")
    conn.commit()
    conn.close()

sysmanage.py

连接students数据库并创建student数据表

  def __init__(self):
        self.con = sqlite3.connect("students.db")
        self.cur = self.con.cursor()
        self.cur.execute('create table if not exists student(ID int,name varchar(10),sex varchar(5))')

3. 初始化窗口

利用tk模块创建一个宽500搞650的窗口,并设置好输入框及按钮用来接收用户输入的内容。sysmanage.py

import tkinter as tk
import sqlite3
from tkinter import messagebox


class MainRun:
    # 以下代码全部为gui界面的初始化
    def __init__(self):
        self.con = sqlite3.connect("students.db")
        self.cur = self.con.cursor()
        self.cur.execute('create table if not exists student(ID int,name varchar(10),sex varchar(5))')
        # 第1步,实例化对象,建立窗口window
        window = tk.Tk()
        window.configure(bg="#F0C0AA")
        # 第2步,给窗口的可视化起名字
        window.title('学生信息管理系统测试版1.0')
        # 第3步,设定窗口的大小(长 * 宽)
        window.geometry('500x650')

        # tk.StringVar()#用于接收用户输入
        self.result = tk.StringVar()
        self.result.set(" ")

        # 关于姓名的 label 和 entry
        self.textName = tk.StringVar()
        self.textName.set("")
        tk.Label(window, text="姓     名:", font=('Arial', 15), bg='#F0C0AA', width=10).place(x=75,y=100, anchor='nw')
        entryLine1 = tk.Entry(window, font=('宋体', 15), textvariable=self.textName, width=20)
        entryLine1.place(x=200, y=100, anchor='nw')  # 显示成明文形式

        # 关于性别的 label 和 entry
        self.textSex = tk.StringVar()
        self.textSex.set("")
        tk.Label(window, text="性     别:", font=('Arial', 15), bg='#F0C0AA', width=10).place(x=75, y =150, anchor='nw')
        entryLine2 = tk.Entry(window, font=('Arial', 15), textvariable=self.textSex, width=18)
        entryLine2.place(x=200, y=150, anchor='nw')

        # 关学号的 label 和 entry
        self.textID = tk.StringVar()
        self.textID.set("")
        tk.Label(window, text="学     号:", bg='#F0C0AA', font=('Arial', 15), width=10).place(x=75, y=50, anchor='nw')
        entryLine3 = tk.Entry(window, font=('Arial', 15), textvariable=self.textID, width=18)
        entryLine3.place(x=200, y=50, anchor='nw')

        # 关于"添加"组件,此处绑定函数add_student用于添加学生信息
        button1_add = tk.Button(window, text='添   加', bg='#95C5C8', font=('Arial', 12), command=self.add_student,width=8)
        button1_add.place(x=40, y=220, anchor='nw')
        # 关于"删除"组件,此处绑定函数delete_student用于删除学生信息
        button2_delete = tk.Button(window, text='删   除', bg='#95C5C8', font=('Arial', 12),command=self.delete_student, width=8)

        button2_delete.place(x=150, y=220, anchor='nw')
        # 关于"修改"组件,此处绑定函数change_student用于修改学生信息
        button3_change = tk.Button(window, text='修   改', bg='#95C5C8', font=('Arial', 12), command=self.change_student, width=8)

        button3_change.place(x=260, y=220, anchor='nw')
        # 关于"显示"组件,此处绑定函数show_student用于显示学生信息
        button4_show = tk.Button(window, text='显   示', bg='#95C5C8', font=('Arial', 12), command=self.show_student, width= 8)
        button4_show.place(x=370, y=220, anchor='nw')
        # 下边两行代码是在gui界面显示我的作者信息
        tk.Label(window, text="@Author:", font=('宋体', 13), bg="#F0C0AA", width=10).place(x=130, y=260, anchor='nw')
        tk.Label(window, text="一笑", font=('宋体', 13), bg="#F0C0AA", width=10).place(x=250, y=260, anchor='nw')

        show_result = tk.Label(window, bg="white", fg="black", font=("宋体", 12), bd='0', anchor='nw',textvariable=self.result)

        show_result.place(x="25", y="300", width="450", height="300")
        # window.protocol('WM_DELETE_WINDOW', custom_over)  # 重写关闭
        window.mainloop()  # 显示主窗口

    # 添加
    def add_student(self):
        pass


    # 删除
    def delete_student(self):
        pass


    # 改变信息
    def change_student(self):
        pass

    # 展示信息
    def show_student(self):
        pass


if __name__ == '__main__':
    app = MainRun()

效果展示:

03dfa08524654af4a5ae98dccb27422f.png

4. 完善功能

基本框架已经布置好了,接下来就需要在对应的功能函数补全内容就行了

4.1 添加信息

添加就是一个获取文本内容在执行插入数据库语句的过程,但是要注意文本内容的一个判断。

 # 添加
    def add_student(self):
        name = self.textName.get()
        sex = self.textSex.get()
        id = self.textID.get()
        if sex == '男' or sex == '女' and name and id:
            # 先查询是否已经存在相同id的数据
            self.cur.execute("SELECT * FROM student WHERE ID = ?", (id,))
            rows = self.cur.fetchall()
            if rows:
                # self.result.set('该ID已存在,请勿重复添加!')
                messagebox.showerror('Error','改id已存在!')
            else:
                self.cur.execute("INSERT INTO student(ID,name, sex) VALUES (?, ?, ?)", (id, name, sex))
                self.con.commit()
                self.cur.execute("SELECT * FROM student")
                rows = self.cur.fetchall()
                for i in rows:
                    self.result.set(i)

                # 清除文本
                self.textName.set("")
                self.textSex.set("")
                self.textID.set("")
                messagebox.showinfo('Ture', '添加成功!')
        else:
            # self.result.set('请输入完整或正确信息!')
            messagebox.showerror('Error','请输入完整或正确信息!')

4.2 删除信息

删除就是根据用户输入传过来的id去数据库遍历,然后执行数据库删除的语句。

 # 删除
    def delete_student(self):
        name = self.textName.get()
        id = self.textID.get()
        sex = self.textSex.get()
        # 查询数据库中是否有需要删除的数据
        self.cur.execute("SELECT * FROM student WHERE ID=? or name = ? or sex = ?", (id, name, sex))
        sql = self.cur.fetchall()

        # 如果查询到有对应的数据,则执行删除操作,否则提示用户输入的数据不存在
        if sql:
            self.cur.execute("DELETE  FROM student WHERE ID = ? or name = ? or sex = ?", (id, name, sex))
            self.con.commit()
            # self.result.set('删除成功!')
            messagebox.showinfo('Ture','删除成功!')
        else:
            messagebox.showerror('Error','请输入要删除的信息!')

        # 清除文本
        self.textName.set("")
        self.textSex.set("")
        self.textID.set("")

4.3 改变信息

改变信息其实与删除有这异曲同工之妙,只不过执行的数据库语句是更新,而不是删除的操作。

这里时刻与id绑定在一起是因为学生的学号id是唯一的标识,为了做到精准删除。

 # 改变信息
    def change_student(self):
        name = self.textName.get()
        sex = self.textSex.get()
        id = self.textID.get()

        if name and id and sex:
            self.cur.execute("UPDATE student set name = ? ,sex = ? WHERE ID = ?", (name, sex, id))
            self.con.commit()
            # self.result.set('更改成功!')
            messagebox.showinfo('Ture','更改成功!')
        elif sex and id:
            self.cur.execute("UPDATE student set sex=? WHERE ID = ?", (sex, id))
            self.con.commit()
            # self.result.set('性别更改成功!')
            messagebox.showinfo('Ture','性别更改成功!')
            # 清除文本
            self.textName.set("")
            self.textSex.set("")
            self.textID.set("")
        elif name and id:
            self.cur.execute("UPDATE student set name = ? WHERE ID = ?", (name, id))
            # self.result.set('姓名更改成功!')
            messagebox.showinfo('Ture','姓名更改成功!')
        else:
            # self.result.set('请输入要更改的信息!')
            messagebox.showerror('Error','请输入要更改的信息!')

4.4 展现信息

展现的过程其实就是遍历一遍数据库里的所有信息,在以设定好的格式进行打印。

 # 展示信息
    def show_student(self):
        result_str = f'{"学号":>3}{"姓名":>7}{"性别":>15}'
        result_str += '\n'
        self.cur.execute("SELECT * FROM student")
        rows = self.cur.fetchall()
        for i in rows:
            result_str += f'{i[0]:>3}{i[1]:>7}{i[2]:>15}'
            result_str += '\n'
        self.result.set(result_str)
        # 清除文本
        self.textName.set("")
        self.textSex.set("")
        self.textID.set("")

5. 登入注册

5.1 初始化窗口

这边我们初始化一个窗口用来布置我们的登入注册

run.py

import tkinter as tk
from tkinter import messagebox
import sqlite3
from urs import init_database
from sysmanage import MainRun
class Login:
    def __init__(self, master):
        # 构造函数
        self.master = master
        self.master.geometry("500x600")
        self.master.title("学生信息管理系统登录与注册")

        self.title_label=tk.Label(self.master,text="欢迎使用学生信息管理系统!",font=("微软雅黑",25),bg="#F0C0AA")
        self.title_label.place(x=30,y=10,width=450,height=100)

        # 用户名和密码标签和输入框
        self.text_user = tk.StringVar()
        self.text_password = tk.StringVar()
        self.text_repeat = tk.StringVar()
        self.user_label = tk.Label(self.master, text="用户名:",font=("微软雅黑",20),bg="#F0C0AA")
        self.user_label.place(x=50,y=170,width=100,height=30)
        self.user_entry = tk.Entry(self.master,font=("微软雅黑",20), textvariable=self.text_user)
        self.user_entry.place(x=170,y=170,width=300,height=30)

        self.pass_label = tk.Label(self.master, text="密码:",font=("微软雅黑",20),bg="#F0C0AA")
        self.pass_label.place(x=50,y=250,width=100,height=30)
        self.pass_entry = tk.Entry(self.master, show="*",font=("微软雅黑",20), textvariable=self.text_password)
        self.pass_entry.place(x=170,y=250,width=300,height=30)

        # 确认密码输入框(用于注册)
        self.confirm_label = tk.Label(self.master, text="确认密码:",font=("微软雅黑",15),bg="#F0C0AA")
        self.confirm_label.place(x=50,y=330,width=100,height=30)
        self.confirm_entry = tk.Entry(self.master, show="*",font=("微软雅黑",20), textvariable=self.text_repeat)
        self.confirm_entry.place(x=170,y=330,width=300,height=30)
        self.confirm_entry.place(x=170,y=330,width=300,height=30)

        # 登录和注册按钮
        self.login_button = tk.Button(self.master, text="登录",font=("微软雅黑",20), bg="#57BF53",command=self.login)
        self.login_button.place(x=50,y=410,width=420,height=30)

        self.register_button = tk.Button(self.master, text="注册", font=("微软雅黑",20),bg="#95C5C8",command=self.register)
        self.register_button.place(x=50,y=470,width=420,height=30)

        # 初始化SQLite数据库
        init_database()

    def login(self):
        pass


    def register(self):
        pass

if __name__ == "__main__":
    root = tk.Tk()
    root.configure(bg="#F0C0AA")
    app = Login(root)
    root.mainloop()

效果展示:

0001b56c5e1b4842b2132d41deeecd64.png

5.2 登入

直接用get方法得到用户的信息,然后在数据库遍历寻找用户的信息,在这里设置了一个判断语句,登入的信息与数据库存储的不一致,将销毁输入的内容并给出提示信息。

    def login(self):
        user = self.user_entry.get()
        password = self.pass_entry.get()
        confirm=self.confirm_entry.get()

        conn = sqlite3.connect("user.db")
        c = conn.cursor()
        c.execute("SELECT password FROM users WHERE user=?", (user,))
        data = c.fetchone()
        conn.close()

        if data and data[0] == password and confirm==password:
            self.master.destroy()
            MainRun()

        else:
            messagebox.showerror("登录错误", "用户名或者密码错误,请检查后重新输入!")

5.3 注册

注册就是在登入的基础上增加了更多的判断语句,和一数据库插入的执行语句。

    def register(self):
        user = self.user_entry.get()
        password = self.pass_entry.get()
        confirm_password = self.confirm_entry.get()

        conn = sqlite3.connect("user.db")
        c = conn.cursor()
        c.execute("SELECT * FROM users WHERE user=?", (user,))
        data = c.fetchone()

        self.text_user.set('')
        self.text_password.set('')
        self.text_repeat.set('')

        if user=='' or password=='' or confirm_password=='':
            messagebox.showerror("注册错误:", "用户名和密码不能为空!")
            c.close()
            conn.close()
            return
        elif data:
            messagebox.showerror("注册错误:","用户名已经存在,请重新输入!")
            conn.close()
            return

        elif password != confirm_password:
            messagebox.showerror("注册错误:", "两次密码输入不相同")
            conn.close()
            return
        else:
            try:
                c.execute("INSERT INTO users (user, password) VALUES (?, ?)", (user, password))
                messagebox.showinfo("注册成功:", "注册成功!请登录后使用")
                conn.commit()
            except Exception as e:
                print(e)
                conn.rollback()

 

6. 最终结果展示

这里只展示部分功能的效果,登入注册就不展示了。

添加

3c0b99ff613b4cbb82401b25725d59af.png

修改

9228b312b0094f5ca7deba000b1d0bb0.png

显示

3c2ceeb6bd9a4fb0a4dfcd7f4b7fb451.png

 

7. 小结

        只是利用自己所学的知识做了个简略版的信息管理系统,还有功能上其实还有很多地方要完善,仅功参考,有兴趣的宝子也可以完善这个项目的功能,能更好的锻炼自己。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值