1 需解決的問題:
? 1.1如何用python做一個用戶登錄界面?
? 1.2需要用到哪些庫、模塊?
2 問題解決:
? 2.1 回答 1.1 :合理即可,無標準回答。
? 2.2 回答 1.2 :tk庫(縮寫)、GUL界面、tkinter。messagebox模塊......
3 代碼展示:?
# -*- coding: utf-8 -*-
import tkinter as tk
import tkinter.messagebox
import pickle
import random# 窗口
window = tk.Tk()
window.title('歡迎進入python')
window.geometry('450x200')
# 畫布放置圖片
# canvas=tk.Canvas(window,height=300,width=500)
# imagefile=tk.PhotoImage(file='qm.png')
# image=canvas.create_image(0,0,anchor='nw',image=imagefile)
# canvas.pack(side='top')
# 標簽 用戶名密碼
Verification_Code = random.randint(1000, 9999)#設置一個隨機的四位數
Verification_Code = str(Verification_Code)#把類型轉換為str型
print(type(Verification_Code))
tk.Label(window, text='用戶名:').place(x=100, y=30)
tk.Label(window, text='密碼:').place(x=100, y=70)
tk.Label(window, text='驗證碼').place(x=100, y=110)
tk.Label(window, text=Verification_Code).place(x=320, y=110)
# 用戶名輸入框
var_usr_name = tk.StringVar()
entry_usr_name = tk.Entry(window, textvariable=var_usr_name)
entry_usr_name.place(x=160, y=30)
# 密碼輸入框
var_usr_pwd = tk.StringVar()
entry_usr_pwd = tk.Entry(window, textvariable=var_usr_pwd, show='*')
entry_usr_pwd.place(x=160, y=70)
#驗證碼輸入框
var_usr_yzm = tk.StringVar()
entry_usr_yzm = tk.Entry(window, textvariable=var_usr_yzm)
entry_usr_yzm.place(x=160, y=110)# 登錄函數
def usr_log_in():# 輸入框獲取用戶名密碼usr_name = var_usr_name.get()usr_pwd = var_usr_pwd.get()usr_yzm = var_usr_yzm.get()#測試類型print(type(usr_yzm),type(Verification_Code))# 從本地字典獲取用戶信息,如果沒有則新建本地數據庫try:with open('usr_info.pickle', 'rb') as usr_file:usrs_info = pickle.load(usr_file)except FileNotFoundError:with open('usr_info.pickle', 'wb') as usr_file:usrs_info = {'admin': 'admin'}pickle.dump(usrs_info, usr_file)# 判斷驗證碼是否正確用戶名和密碼是否匹配if usr_yzm == Verification_Code:if usr_name in usrs_info:if usr_pwd == usrs_info[usr_name]:tk.messagebox.showinfo(title='welcome',message='歡迎您:' + usr_name)else:tk.messagebox.showerror(message='密碼錯誤')# 用戶名密碼不能為空elif usr_name == '' or usr_pwd == '':tk.messagebox.showerror(message='用戶名或密碼為空')# 不在數據庫中彈出是否注冊的框else:is_signup = tk.messagebox.askyesno('歡迎', '您還沒有注冊,是否現在注冊')if is_signup:usr_sign_up()elif usr_yzm == '':tk.messagebox.showerror(message='驗證碼不能為空')else:tk.messagebox.showerror(message='驗證碼有誤!')# 注冊函數
def usr_sign_up():# 確認注冊時的相應函數def signtowcg():# 獲取輸入框內的內容nn = new_name.get()np = new_pwd.get()npf = new_pwd_confirm.get()# 本地加載已有用戶信息,如果沒有則已有用戶信息為空try:with open('usr_info.pickle', 'rb') as usr_file:exist_usr_info = pickle.load(usr_file)except FileNotFoundError:exist_usr_info = {}# 檢查用戶名存在、密碼為空、密碼前后不一致if nn in exist_usr_info:tk.messagebox.showerror('錯誤', '用戶名已存在')elif np == '' or nn == '':tk.messagebox.showerror('錯誤', '用戶名或密碼為空')elif np != npf:tk.messagebox.showerror('錯誤', '密碼前后不一致')# 注冊信息沒有問題則將用戶名密碼寫入數據庫else:exist_usr_info[nn] = npwith open('usr_info.pickle', 'wb') as usr_file:pickle.dump(exist_usr_info, usr_file)tk.messagebox.showinfo('歡迎', '注冊成功')# 注冊成功關閉注冊框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, text='用戶名:').place(x=10, y=10)tk.Entry(window_sign_up, textvariable=new_name).place(x=150, y=10)# 密碼變量及標簽、輸入框new_pwd = tk.StringVar()tk.Label(window_sign_up, text='請輸入密碼:').place(x=10, y=50)tk.Entry(window_sign_up, textvariable=new_pwd, show='*').place(x=150, y=50)# 重復密碼變量及標簽、輸入框new_pwd_confirm = tk.StringVar()tk.Label(window_sign_up, text='請再次輸入密碼:').place(x=10, y=90)tk.Entry(window_sign_up, textvariable=new_pwd_confirm, show='*').place(x=150, y=90)# 確認注冊按鈕及位置bt_confirm_sign_up = tk.Button(window_sign_up, text='確認注冊',command=signtowcg)bt_confirm_sign_up.place(x=150, y=130)# 退出的函數
def usr_sign_quit():window.destroy()# 登錄 注冊按鈕
bt_login = tk.Button(window, text='登錄', command=usr_log_in)
bt_login.place(x=140, y=150)
bt_logup = tk.Button(window, text='注冊', command=usr_sign_up)
bt_logup.place(x=210, y=150)
bt_logquit = tk.Button(window, text='退出', command=usr_sign_quit)
bt_logquit.place(x=280, y=150)
# 主循環
window.mainloop()
?3.1 代碼運行結果展示:
需注意:如果是未注冊用戶,系統會提示用戶先注冊在登錄。如是已注冊用戶,可以直接登錄。
注冊頁面:
填寫完之后,點擊“確認注冊”系統會彈出一個“注冊成功”的彈窗。
4 總結 :
這段代碼是一個簡單的登錄注冊系統的實現,使用了tkinter庫進行圖形化界面的開發。
- 首先導入了tkinter庫以及其他需要的模塊(tkinter.messagebox、pickle、random);
- 創建一個窗口,并設置標題和大小;
- 在窗口中添加了用戶名、密碼、驗證碼等標簽和輸入框;
- 定義了登錄函數(usr_log_in)和注冊函數(usr_sign_up);
- 登錄函數中首先獲取用戶輸入的用戶名、密碼和驗證碼,并從本地數據庫中讀取用戶信息;
- 判斷驗證碼是否正確,如果正確則繼續判斷用戶名和密碼是否匹配,如果不匹配則彈出密碼錯誤提示框;
- 如果用戶名存在但密碼為空,則彈出用戶名或密碼為空的提示框;
- 如果用戶名不存在,則彈出是否注冊的提示框,用戶選擇注冊后調用注冊函數;
- 注冊函數中創建了一個新窗口,并添加了用戶名、密碼和確認密碼的輸入框;
- 確認注冊后首先檢查用戶名是否已存在,如果存在則彈出用戶名已存在的錯誤提示框;
- 如果密碼為空或用戶名為空,則彈出用戶名或密碼為空的錯誤提示框;
- 如果兩次輸入的密碼不一致,則彈出密碼前后不一致的錯誤提示框;
- 如果注冊信息沒有問題,則將用戶名和密碼寫入本地數據庫,并彈出注冊成功的提示框;
- 最后添加了登錄、注冊、退出按鈕,并通過按鈕的command屬性調用相關的函數;
- 進入主循環,等待用戶交互。
需要注意的地方:
- 該程序使用了pickle模塊來讀寫本地數據庫usr_info.pickle,該文件保存了用戶名和密碼的字典;
- 驗證碼使用了random模塊生成一個四位數,作為用戶登錄時的驗證碼,用戶需要輸入相同的驗證碼才能登錄成功;
- 程序使用了tkinter.messagebox模塊彈出提示框。