• Python学习笔记_02:使用Tkinter连接MySQL数据库实现登陆注册功能


    1 环境搭建

    1.1 Python安装

    1.2 MySQL环境搭建

    1.3安装MySQLdb 

    2 具体实现

    2.1 登陆界面

    2.2 注册界面

    2.3 具体实现部分代码

     


    1 环境搭建

    1.1 Python安装

    本文具体实现部分Python环境:Python2.7.14,64位版本

     

    具体安装步骤见:Python 环境搭建

    附:配置PythonIDE,推荐PyCharm(具体IDE界面见下图),下载点击运行即可使用

    PyCharm 官方下载地址:http://www.jetbrains.com/pycharm/download/

    官方下载速度可能有点慢,附百度云盘下载链接:http://pan.baidu.com/s/1pLC5Kdd 密码:u3nb

    1.2 MySQL环境搭建

    本文具体实现部分MySQL环境:MySQL5.7.13,64位版本

     

    具体安装步骤见:mysql5.7.13-windows 免安装版配置简介

    推荐一款操作MySQL很好用的IDE:Navicat,链接:http://pan.baidu.com/s/1nvFrKCT 密码:tzr3(PS:可破解哦)

    1.3安装MySQLdb

    MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的。如果自己下载安装的Python版本自带MySQLdb模块,则不需要重新配置安装。

    此处要注意自己安装的Python和MySQL版本是64位还是32位,否则在进行安装MySQLdb时会报错。

    此处分享一个 MySQL-python-1.2.5.win-amd64-py2.7.exe版本(PS:目前最新哦,免费提供,楼主自己是在CSDN上花了四个下载币弄来的),链接:http://pan.baidu.com/s/1nuDF6lj 密码:9xyb


    2 具体实现

    2.1 登陆界面

    PS:界面很丑,不过主要为了熟悉Python基础语法,以及如何操作MySQL数据库,有兴趣同学可以自己查询相关组件属性,可以对界面进行美化。

     

    使用Navicat查询book数据库中user表具体数据信息:

    此处实现功能:

    (1)点击登陆,如果输入用户名和密码与后台mysql数据库中查询数据一致,则跳出提示框验证成功;否则提示用户名或密码错误,验证失败。

    (2)点击注册,跳转到注册界面,隐藏登陆界面。

    (3)记住用户名和密码选择框是为了显示设计的登陆界面好看一点,未实现具体功能。

    2.2 注册界面

    此处实现功能:

    (1)用户输入注册用户名、注册密码,点击确定注册按钮后,在IDE输出框会打印数据插入成功提示,否则会打印数据插入失败提示。

    (2)用户点击返回按钮,此时会重新启动一个登陆界面,供刚才注册账号和密码进行登陆验证。

    2.3 具体实现部分代码

    登陆界面login.py

    # -*- coding: UTF-8 -*-
    
    import MySQLdb
    from Tkinter import *
    from register import *
    from tkFont import Font
    from tkMessageBox import *
    
    try:
        from ttk import Entry, Button
    except ImportError:
        pass
    
    class Login(object):
        def __init__(self):
            self.root = Tk()
            self.root.title(u'登录')
            self.root.resizable(False, False)
            self.root.geometry('+450+250')
            self.sysfont = Font(self.root, size=15)
            self.lb_user = Label(self.root, text=u'用户名:',width = 20,height = 10,font=("黑体", 15, "bold"))
            self.lb_passwd1 = Label(self.root, text=u'')
            self.lb_passwd = Label(self.root, text=u'密码:',width = 20,height = 5,font=("黑体", 15, "bold"))
            self.lb_user.grid(row=0, column=0, sticky=W)
            self.lb_passwd1.grid(row=1, column=0, sticky=W)
            self.lb_passwd.grid(row=2, column=0, sticky=W)
    
            self.en_user = Entry(self.root, font=self.sysfont, width=24)
            self.en_passwd = Entry(self.root, font=self.sysfont, width=24)
            self.en_user.grid(row=0, column=1, columnspan=1)
            self.en_passwd.grid(row=2, column=1, columnspan=1)
            self.en_user.insert(0, u'请输入用户名')
            self.en_passwd.insert(0, u'请输入密码')
            self.en_user.config(validate='focusin',
                                validatecommand=lambda: self.validate_func('self.en_user'),
                                invalidcommand=lambda: self.invalid_func('self.en_user'))
            self.en_passwd.config(validate='focusin',
                                  validatecommand=lambda: self.validate_func('self.en_passwd'),
                                  invalidcommand=lambda: self.invalid_func('self.en_passwd'))
    
            self.var = IntVar()
            self.ckb = Checkbutton(self.root, text=u'记住用户名和密码', underline=0,
                                   variable=self.var,font=(15))
            self.ckb.grid(row=3, column=0)
            self.bt_print = Button(self.root, text=u'登陆')
            self.bt_print.grid(row=3, column=1, sticky=E, pady=50,padx = 10)
            self.bt_print.config(command=self.print_info)
    
            self.bt_register = Button(self.root, text=u'注册')
            self.bt_register.grid(row=3, column=2, sticky=E, pady=50, padx=50)
            self.bt_register.config(command=self.register_info)
            # self.root.bind('<Return>', self.enter_print)
            self.root.mainloop()
    
        def validate_func(self, en):
            return False if eval(en).get().strip() != '' else True
    
        def invalid_func(self, en):
            value = eval(en).get().strip()
            if value == u'输入用户名' or value == u'输入密码':
                eval(en).delete(0, END)
            if en == 'self.en_passwd':
                eval(en).config(show='*')
    
        def print_info(self):
            en1_value = self.en_user.get().strip()
            en2_value = self.en_passwd.get().strip()
            txt = u'''用户名: %s 
    密码  : %s ''' % (self.en_user.get(), self.en_passwd.get())
            if en1_value == '' or en1_value == u'输入用户名':
                showwarning(u'无用户名', u'请输入用户名')
            elif en2_value == '' or en2_value == u'输入密码':
                showwarning(u'无密码', u'请输入密码')
            else:
                a = 0
                # 打开数据库连接
                db = MySQLdb.connect("localhost", "root", "root", "book")
                # 使用cursor()方法获取操作游标
                cursor = db.cursor()
                # SQL 查询语句
                sql = "select * from user"
                try:
                    # 执行SQL语句
                    cursor.execute(sql)
                    # 获取所有记录列表
                    results = cursor.fetchall()
                    for row in results:
                        id = row[0]
                        name = row[1]
                        pwd = row[2]
                        if name == en1_value and pwd == en2_value:
                            a = 1
                            print "数据库连接及验证成功!!!"
                            showinfo('登陆成功!!!', txt)
                        # # 打印结果
                        # print "id=%d,name=%s,pwd=%s" % 
                        #       (id, name, pwd)
                except:
                    print "Error: unable to fecth data"
    
                # 关闭数据库连接
                db.close()
                if(a == 0):
                    showinfo('用户名或密码错误!!!', txt)
    
        def register_info(self):
            self.rootR = Tk()
            loginPage(self.rootR)
            self.root.withdraw()
    
        def enter_print(self, event):
            self.print_info()
    
    if __name__ == "__main__":
        Login()

    注册界面register.py

    # coding=utf-8
    
    import MySQLdb
    from login import *
    from Tkinter import *
    import string
    
    class loginPage(object):
        def __init__(self, master, info='欢迎您进入注册页面'):
            self.master = master
            self.mainlabel = Label(master, text=info, justify=CENTER)
            self.mainlabel.grid(row=0, columnspan=3)
    
            self.user = Label(master, text='注册用户名:', borderwidth=3)
            self.user.grid(row=1, sticky=W)
    
            self.pwd = Label(master, text='注册密码:', borderwidth=3)
            self.pwd.grid(row=2, sticky=W)
    
            self.userEntry = Entry(master)
            self.userEntry.grid(row=1, column=1, columnspan=3)
            self.userEntry.focus_set()
    
            self.pwdEntry = Entry(master, show='*')
            self.pwdEntry.grid(row=2, column=1, columnspan=3)
    
            self.loginButton = Button(master, text='确定注册', borderwidth=2, command=self.login)
            self.loginButton.grid(row=3, column=1)
    
            self.clearButton = Button(master, text='返回', borderwidth=2, command=self.clear)
            self.clearButton.grid(row=3, column=2)
    
        def login(self):
            self.username = self.userEntry.get().strip()
            self.passwd = self.pwdEntry.get().strip()
            # 打开数据库连接
            db = MySQLdb.connect("localhost", "root", "root", "book")
            # 使用cursor()方法获取操作游标
            cursor = db.cursor()
            # SQL 插入语句
            sql = "INSERT INTO user(name, pwd) VALUES ('%s', '%s')" % (self.username, self.passwd)
            try:
                # 执行sql语句
                cursor.execute(sql)
                print "数据插入成功!!!"
                # 提交到数据库执行
                db.commit()
            except:
                print "数据插入失败!!!"
                # Rollback in case there is any error
                db.rollback()
    
            # 关闭数据库连接
            db.close()
    
    
    
        def clear(self):
            self.userEntry.delete(0, END)
            self.pwdEntry.delete(0, END)
            Login()
    
    if __name__ == '__main__':
        root = Tk()
        root.title('注册')
        myLogin = loginPage(root)
    
        # root.wait_window(myLogin.mySendMail.sendPage)
        mainloop()

     

     

     

    参考资料:

    1. http://www.shouce.ren/api/view/a/4763
    2. http://blog.csdn.net/wjciayf/article/details/50722215
    3. http://blog.csdn.net/wangyiyan315/article/details/16846467
  • 相关阅读:
    漫话性能:USE方法
    MIPI 屏参调试
    Linux下访问匿名页发生的神奇“化学反应”
    USB 2.0 suspend resume
    谈谈Linux内核驱动的coding style
    Apollo ROS原理(一)
    BMS(电池管理系统)第五课 ——核心!!!SOH算法开发
    蓝牙核心技术概述(一)蓝牙概述
    BMS(电池管理系统)第三课 ——BMS功能清单和采样要求
    登录密码加密vue版(转载)
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/7765795.html
Copyright © 2020-2023  润新知