1.创建数据库
(1)创建一个students和user数据库分别用来存储学生信息和用户信息。
终端输入mysql -u root -p 进入登入mysql,分别输入 :
create database students;
create database user;
创建students,user数据库
(2)创建项目所需文件
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()
效果展示:
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()
效果展示:
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. 最终结果展示
这里只展示部分功能的效果,登入注册就不展示了。
添加
修改
显示
7. 小结
只是利用自己所学的知识做了个简略版的信息管理系统,还有功能上其实还有很多地方要完善,仅功参考,有兴趣的宝子也可以完善这个项目的功能,能更好的锻炼自己。