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安裝
本文具體實現部分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()
參考資料:
- http://www.shouce.ren/api/view/a/4763
- http://blog.csdn.net/wjciayf/article/details/50722215
- http://blog.csdn.net/wangyiyan315/article/details/16846467