用Python连接操作MySQL数据库,做一个简单的用户登录注册系统

       我们可以很容易地用Python实现一个用户登录系统,相信这即使是对编程新手来说也是小菜一碟。

       作为Python的小萌新,今天我想记录下来的是如何实现一个连接了MySQL数据库的用户登录注册系统,它的效果图大概如下:

       该系统能连接到MySQL中我创建的“用户信息”表(下图为navicat中显示的表信息)。

       该系统能对数据库中的此表进行查询和插入的操作,从而达到登录和注册的功能。

       其中登录满足下列限制条件:

1、输入的用户名和密码不得为空;

2、用户名和密码需与表中的记录对应。

       注册满足:

1、用户名和密码不得为空;

2、不可以注册已存在的用户名。

       系统的实现大致分为两部分,一部分是数据库的连接,一部分是界面的设计,下面我先贴上代码,再进行说明。

import MySQLdb
from tkinter import *
from tkinter import messagebox

# 连接数据库
class MysqlSearch(object):
	def __init__(self):
		self.get_conn()

	# 获取连接
	def get_conn(self):
		try:
			self.conn = MySQLdb.connect(
				host='127.0.0.1',
				user='root',
				passwd='',
				db='personnelmanagement',
				charset='utf8'
				)
		except MySQLdb.Error as e:
			print('Error: %s' % e)
	
	# 关闭连接
	def close_conn(self):
		try:
			if self.conn:
				self.conn.close()
		except MySQLdb.Error as e:
			print('Error: %s' % e)

	# 获取用户信息(登录用)
	def get_userinfo(self):
		sql = 'SELECT * FROM 登陆账户'
        
        # 使用cursor()方法获取操作游标
		cursor = self.conn.cursor()

        # 使用execute()方法执行SQL语句
		cursor.execute(sql)

        # 使用fetchall()方法获取全部数据
		result = cursor.fetchall()
        
        # 将数据用字典形式存储于result
		result = [dict(zip([k[0] for k in cursor.description],row)) for row in result]

        # 关闭连接
		cursor.close()
		self.close_conn()
		return result

	# 注册
	def insert_userinfo(self,a,b):
		self.a = a
		self.b = b
		sql = 'SELECT * FROM 登陆账户'
		cursor = self.conn.cursor()
		cursor.execute(sql)
		result = cursor.fetchall()
		result = [dict(zip([k[0] for k in cursor.description],row)) for row in result]
		ulist = []
		for item in result:
			ulist.append(item['用户名'])
		try:
			# sql = 'INSERT INTO 登陆账户(用户名,密码) VALUES(%s,%s)'
			cursor = self.conn.cursor()
			cursor.execute('INSERT INTO 登陆账户(用户名,密码) VALUES(%s,%s)',(self.a,self.b))
			if self.a == '' or self.b == '':
				self.conn.rollback()
				messagebox.showerror('警告',message = '注册失败')
			elif self.a in ulist:
				messagebox.showerror('警告',message = '用户名已存在')
			else:
				# 提交事务
				self.conn.commit()

				messagebox.showinfo(title = '恭喜',message = '注册成功')
			cursor.close()
			self.close_conn()
		except:
            # 限制提交
			self.conn.rollback()

def cancel():
	# 清空用户输入的用户名和密码
	user.set('')
	passwd.set('')

# 注册按钮事件的处理函数
def register():
	register_name = entry_user.get()
	register_pwd = entry_passwd.get()
	obj_r = MysqlSearch()
	obj_r.insert_userinfo(register_name,register_pwd)

def login():
	# 获取用户名和密码
	obj = MysqlSearch()
	result = obj.get_userinfo()
	name = entry_user.get()
	pwd = entry_passwd.get()
	ulist = []
	plist = []
	for item in result:
		ulist.append(item['用户名'])
		plist.append(item['密码'])
	deter = True
	for i in range(len(ulist)):
		while True:
			if name == ulist[i] and pwd == plist[i]:
				messagebox.showinfo(title = '恭喜',message = '登陆成功')# 登陆成功则执行begin函数
				deter = False
				break
			else:
				break
	while deter:
		messagebox.showerror('警告',message='用户名或密码错误')
		break


# 创建应用程序窗口
win_login = Tk()
win_login.title('人事管理系统登录')

# 禁止拉伸窗口
win_login.resizable(width = False, height = False)
win_login.geometry('600x300+382+183')

# 在窗口上创建标签组件
Label(win_login,text='用户名',font = ('微软雅黑'),justify=RIGHT,width=80).place(x=190,y=50,width=80,height=40)
Label(win_login,text='密码',font = ('微软雅黑'),justify=RIGHT,width=80).place(x=190,y=100,width=80,height=40)

# 创建字符串变量和文本框组件,同时设置关联的变量
# 用户名
user = StringVar(win_login,value='')
entry_user = Entry(win_login,width=80,textvariable=user)
entry_user.place(x=310,y=50,width=80,height=40)

# 密码
passwd = StringVar(win_login,value='')
entry_passwd = Entry(win_login,show='*',width=80,textvariable=passwd)
entry_passwd.place(x=310,y=100,width=80,height=40)

# 按钮
Button(win_login,text='登录',font = ('微软雅黑'),command=login).place(x=150,y=150,width=80,height=50)
Button(win_login,text='注册',font = ('微软雅黑'),command=register).place(x=260,y=150,width=80,height=50)
Button(win_login,text='取消',font = ('微软雅黑'),command=cancel).place(x=370,y=150,width=80,height=50)

# 启动消息循环
win_login.mainloop()

      tkinter模块是Python的标准Tk GUI工具包的接口,我们用两行代码调用:

from tkinter import *
from tkinter import messagebox

      接下来先跳过类和函数部分,看程序界面实现的代码。由于我在代码中都加上了注释说明,因此这里我就不做过多说明。

      MySQLdb不是Python自带的,需要自行安装。安装成功后用一行代码调用:

import MySQLdb

      我创建了一个MysqlSearch类用来连接数据库,它继承了object类。其中除了__init__()以外,包含四个方法,分别是get_conn()、close_conn()、get_userinfo()、insert_userinfo()。

(1)get_conn() 方法用于获取连接,它是用MySQLdb调用connect() 方法实现的,方法中的host表示主机,常用‘localhost’或‘127.0.0.1’,user表示用户名,passwd表示密码,db表示所连接的数据库,charset表示编码方式,这其中还省略了一个默认的端口号port = '3306'。我们可以通过查看数据库中创建的连接属性,来对应地编写此处代码。

(2)close_conn() 方法用于关闭连接。

(3)get_userinfo() 方法用于查询数据库中“用户信息”表的记录,用于登录功能的实现。由于代码中有详细注释,这里不多说明。

(4)insert_userinfo() 方法用于对数据库中的“用户信息”表进行查询和插入操作,用于注册功能的实现。该方法中有两个参数a和b,分别对应用户名输入框和密码输入框输入的信息,我们用%s格式化的方法,将其写入sql语句中:

cursor.execute('INSERT INTO 登陆账户(用户名,密码) VALUES(%s,%s)',(self.a,self.b))

      我们回过头来看到“登录”、“注册”、“取消”三个按钮的命令跳转(command)分别触发三个函数login()、register()、cancel()。

      login() 函数中我们首先创建对象,调用MysqlSearch类中的方法get_userinfo(),查询并获取“用户信息”表的记录后,进行登录的判断。

      register() 函数中往MysqlSearch类中的方法insert_userinfo() 传入输入框的输入的信息,作为参数并判断。

      cancel() 函数中用set() 方法对输入框的信息进行清空处理。

       至此,系统就做完啦!当然了,这只是一个非常简单的系统,但我认为它包含了很多必要的方法,对系统的进一步编写大有作用。

  • 57
    点赞
  • 479
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值