Python + Tkinter簡單實現註冊登入(連線本地MySQL資料庫)

專注的阿熊發表於2022-01-18

# -*- coding: utf-8 -*-

"""

@date:  2022/01/09 17:40

@author: Anker

@python v3.10

"""

import tkinter as tk

import tkinter.messagebox

import pymysql

# 定義要執行的建立表的 SQL 語句

test_sql = """

                 CREATE TABLE IF NOT EXISTS user(

                 id INT auto_increment PRIMARY KEY,

                 name varchar(20) not null,

                 password varchar(20) not null

                 )ENGINE=innodb DEFAULT CHARSET=utf8;

            """

# 登入視窗

window = tk.Tk()

window.title(' 學生考試系統 ')

window.geometry('800x500')

# 登入背景圖片

canvas = tk.Canvas(window, height=1920, width=1080)

login_background = tk.PhotoImage(file='./view.png')

login_image = canvas.create_image(0, 0, anchor='nw', image=login_background)

canvas.pack(side='top')

# 使用者名稱密碼標籤

tk.Label(window, text=' 使用者名稱 :', bg='yellow').place(x=300, y=200)

tk.Label(window, text=' 密   碼 :', bg='yellow').place(x=300, y=250)

# 使用者名稱輸入框

var_user_name = tk.StringVar()

entry_user_name = tk.Entry(window, textvariable=var_user_name)

entry_user_name.place(x=370, y=200)

# 密碼輸入框

var_user_pwd = tk.StringVar()

entry_user_pwd = tk.Entry(window, textvariable=var_user_pwd, show='*')

entry_user_pwd.place(x=370, y=250)

# 登入函式

def user_login():

     # 輸入框獲取使用者名稱密碼

     user_name = var_user_name.get()

     user_password = var_user_pwd.get()

     # 連線 test_sql 資料庫

     conn = pymysql.connect(host="localhost", user="root", password="123456", database="test_sql", charset="utf8")

     curs = conn.cursor()

     # 執行 SQL 語句,建立 user 資料表

     curs.execute(test_sql)

     # 執行 SQL 語句,從 user 資料表中查詢 name password 欄位值

     curs.execute("SELECT name,password FROM user")

     # 將資料庫查詢的結果儲存在 result

     result = curs.fetchall()

     # fetchone() 函式它的返回值是單個的元組 , 也就是一行記錄 , 如果沒有結果 , 那就會返回 null

     # fetchall() 函式它的返回值是多個元組 , 即返回多個行記錄 , 如果沒有結果 , 返回的是 ()

     # assert result, " 資料庫無該使用者資訊 "   # 新增斷言,判斷資料庫有無該使用者資訊,沒有就直接斷言錯誤

     # 登入賬號操作

     name_list = [it[0] for it in result]    # 從資料庫查詢的 result 中遍歷查詢元組中第一個元素 name

     # 判斷使用者名稱或密碼不能為空

     if not(user_name and user_password):

         tk.messagebox.showwarning(title=' 警告 ', message=' 使用者名稱或密碼不能為空 ')

     # 判斷使用者名稱和密碼是否匹配

     elif user_name in name_list:

         if user_password == result[name_list.index(user_name)][1]:

             tk.messagebox.showinfo(title=' 歡迎您 ', message='        登入成功! \r\n 當前登入賬號為: ' + user_name)

             selection()

         else:

             tk.messagebox.showerror(title=' 錯誤 ', message=' 密碼輸入錯誤 ')

     # 賬號不在資料庫中,則彈出是否註冊的框

     else:

         is_signup = tk.messagebox.askyesno(title=' 提示 ', message=' 該賬號不存在,是否現在註冊? ')

         if is_signup:

             user_register()

# 註冊函式

def user_register():

     # 確認註冊函式

     def register_confirm():

         # 獲取輸入框內的內容

         name = new_name.get()

         password = new_password.get()

         password_confirm = new_password_confirm.get()

         # 先在本地手動建立一個 test_sql 資料庫,然後連線該資料庫

         conn = pymysql.connect(host="localhost", user="root", password="123456", database="test_sql", charset="utf8")

         curs = conn.cursor()

         # 註冊賬號操作

         try:

             # 執行 SQL 語句,建立 user 資料表

             curs.execute(test_sql)

             # user 資料表中插入語句

             insert_sql = "INSERT INTO user(name, password) VALUES ('%s', '%s')" % (name, password)

             # 讀取 user 資料表中的 name password 欄位值

             read_sql = f'''select * from user where name = "{name}" and password = "{password}" '''

             user_data = curs.execute(read_sql)

             # 判斷註冊賬號和密碼

             if not (name and password):

                 tk.messagebox.showwarning(title=' 警告 ', message=' 註冊賬號或密碼不能為空 ')

             elif password != password_confirm:

                 tk.messagebox.showwarning(title=' 警告 ', message=' 兩次密碼輸入不一致,請重新輸入 ')

             else:

                 if user_data.real:

                     tk.messagebox.showwarning(title=' 警告 ', message=' 該註冊賬號已存在 ')

                 else:

                     curs.execute(insert_sql)

                     tk.messagebox.showinfo(title=' 恭喜您 ', message='       註冊成功! \r\n 註冊賬號為: ' + name)

                     print(" 資料插入成功 ")

             # 提交到資料庫執行

             conn.commit()

             curs.close()

         except IOError:

             print(" 資料插入失敗 ")

             conn.rollback()

         # 關閉資料庫連線

         conn.close()

         window_sign_up.destroy()

     # 註冊視窗

     window_sign_up = tk.Toplevel(window)

     window_sign_up.geometry('350x200')

     window_sign_up.title(' 歡迎註冊 ')

     # 註冊賬號及標籤、輸入框

     new_name = tk.StringVar()

     tk.Label(window_sign_up, bg='green', text=' 註冊賬號: ').place(x=50, y=10)

     tk.Entry(window_sign_up, textvariable=new_name).place(x=150, y=10)

     # 註冊密碼及標籤、輸入框

     new_password = tk.StringVar()

     tk.Label(window_sign_up, bg='green', text=' 密      碼: ').place(x=50, y=50)

     tk.Entry(window_sign_up, textvariable=new_password, show='*').place(x=150, y=50)

     # 重複密碼及標籤、輸入框

     new_password_confirm = tk.StringVar()

     tk.Label(window_sign_up, bg='green', text=' 確認密碼: ').place(x=50, y=90)

     tk.Entry(window_sign_up, textvariable=new_password_confirm, show='*').place(x=150, y=90)

     # 確認註冊按鈕及位置

     bt_confirm_sign_up = tk.Button(window_sign_up, bg='green', text=' 確認註冊 ', command=register_confirm)

     bt_confirm_sign_up.place(x=150, y=130)

# 選擇題函式

def selection():

     def wrong():

         tk.messagebox.showerror(title=' 錯誤 ', message=' 抱歉,您答錯了 ')

     def right():

         tk.messagebox.showinfo(title=' 提示 ', message=' 恭喜您,答對了 ')

     # 選擇題視窗

     window_options = tk.Toplevel(window)

     window_options.geometry('350x200')

     window_options.title(' 選擇題 ')

     # 在圖形介面上建立一個標籤 label 用以顯示並放置

     var = tk.StringVar()  # 定義一個 var 用來將 radiobutton 的值和 Label 的值聯絡在一起 .

     lab = tk.Label(window_options, bg='red', fg='white', width=50)

     lab.pack()

     lab.config(text=' 1 題:兩個銳角均為 60 度的三角形是什麼三角形() ' + var.get())

     # 建立 3 radiobutton 選項,外匯跟單gendan5.com其中 variable=var, value='A' 表示:當滑鼠選中其中一個選項,把 value 的值 A 放到變數 var 中,然後賦值給 variable

     radio1 = tk.Radiobutton(window_options, text='A :銳角三角形 ', variable=var, value='A', command=wrong)

     radio1.pack()

     radio2 = tk.Radiobutton(window_options, text='B :鈍角三角形 ', variable=var, value='B', command=wrong)

     radio2.pack()

     radio3 = tk.Radiobutton(window_options, text='C :等邊三角形 ', variable=var, value='C', command=right)

     radio3.pack()

     radio4 = tk.Radiobutton(window_options, text='D :直角三角形 ', variable=var, value='D', command=wrong)

     radio4.pack()

# 註冊和登入按鈕

bt_register = tk.Button(window, bg='yellow', text=' 註冊 ', command=user_register)

bt_register.place(x=380, y=300)

bt_login = tk.Button(window, bg='yellow', text=' 登入 ', command=user_login)

bt_login.place(x=440, y=300)

# 主迴圈

window.mainloop()


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2852854/,如需轉載,請註明出處,否則將追究法律責任。

相關文章