Python學習筆記_02:使用Tkinter連接MySQL資料庫實現登陸註冊功能

来源:http://www.cnblogs.com/liuzhen1995/archive/2017/11/01/7765795.html
-Advertisement-
Play Games

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位版本 具體安裝步驟見:P ...


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 \n密碼  : %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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 //定義類 2 public class MyClass 3 { 4 public int Property1 { get; set; } 5 } 6 static void Main() 7 { 8 MyClass tmp_Class = new MyClass(); 9 tmp_Class.... ...
  • 今天練習angularjs的ng-change事件。 比如用戶作出選擇時,系統所指定的選項中,沒有用戶合適的選項。此時我們可以讓用戶填寫。 剛開始文本框是隱藏的。當用戶選擇了checkbox之後才會顯示出來。 在angularjs程式的model中IsVisible的值為false。 這樣子,程式在 ...
  • 1,同步電腦時間和北京時間 2,設置path地址為需要搶券的地址和搶券時間 搶券地址--> 搶券地址(註意不要漏掉http://或者https://) --> 搶券時間 時分 秒 3,點擊... ...
  • 之前 ,有想做一個文件管理頁面。 參考了 許多資料,終於完成了一個基於Asp.net MVC 的文件管理Demo.界面如下。 一,實現功能及相關技術 文件管理Demo基於Asp.NET MVC ,主要實現了 文件列表瀏覽,文件夾創建與刪除,文件夾以及文件重命名,文件與文件夾的複製、剪切、壓縮,文件與 ...
  • .net core已經發佈了2.0版本,相對於1.0的有了很大的完善,最近準備在項目中嘗試使用asp.net core,所以就進行了一些簡單的研究。 初識asp.net core分為以下幾個部分: 1、.net core SDK以及vs2017下載安裝 2、創建asp.net core項目 3、初識 ...
  • 1:做過圖像顯示的都知道,我們的圖片大部分都是壓縮過的,大部分為JPEG PNG BMP其中BMP格式是點陣形式,當圖片翻譯到記憶體之後無論壓沒壓縮過都會變成BMP格式放進記憶體,在這個過程中,圖片數據會幾倍的增大,就比如JPEG,一張1M大小的JPEG格式的圖片,翻譯到記憶體可能就會變成7倍左右,也就是 ...
  • C# 語言是在2000發佈的,至今已正式發佈了7個版本,每個版本都包含了許多令人興奮的新特性和功能更新。同時,C# 每個版本的發佈都與同時期的 Visual Studio 以及 .NET 運行時版本高度耦合,這也有助於開發者更好的學習掌握 C#,並將其與 Visual Studio 以及 .NET ... ...
  • 原文:https://www.stevejgordon.co.uk/asp-net-core-anatomy-part-3-addmvc 發佈於:2017年4月環境:ASP.NET Core 1.1 本系列前面兩篇文章介紹了ASP.NET Core中IServiceCollection兩個主要擴展方 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...