Python程序开发之简单小程序实例
(10)登录注册窗体的实现
一、项目功能
利用Tkinter组件中的Canvas绘制用户登录窗体,实现用户登录判断和注册。
二、项目分析
要实现用户登录功能,需先导入Tkinter组件,然后用Canvas完成绘制。首先绘制一个登录窗体,然后在窗体中绘制标签、输入框和按钮控件。当用户输入用户名和登录密码时,需要对用户输入的数据进行判断,如果是未注册的用户名,就需要提示用户注册。
三、程序源代码
源码部分截图:


#!/usr/bin/python3.6
# -*- coding: GBK -*-
# 导入Tkinter
import tkinter as tk
import tkinter.messagebox
import pickle
# 实例化window窗口
window = tk.Tk()
# 窗口的可视化名
window.title('欢迎来到登录系统')
# 设定窗口的长和宽,长和宽中间的乘是小写字母x
window.geometry('400x250')
# 加载窗体图片
canvas = tk.Canvas(window, width=400, height=100, bg='white')
image_file = tk.PhotoImage(file='myblllog.gif')
image = canvas.create_image(200, 0, anchor='n', image=image_file)
canvas.pack(side='top')
# 显示用户名和密码的标签,标签的参数:父窗体,标签名,显示字体类型和大小,在父窗体中的位置
tk.Label(window, text='用户名:', font=('Arial', 14)).place(x=40, y=120)
tk.Label(window, text='密码:', font=('Arial', 14)).place(x=40, y=150)
# 用户名输入框
var_usr_name = tk.StringVar()
# 设置默认名称为 shenhaicyg@163.com
var_usr_name.set('shenhaicyg@163.com')
entry_usr_name = tk.Entry(window, textvariable=var_usr_name, font=('Arial', 14))
entry_usr_name.place(x=120,y=125)
# 用户密码输入框
var_usr_pwd = tk.StringVar()
entry_usr_pwd = tk.Entry(window, textvariable=var_usr_pwd, font=('Arial', 14), show='*')
entry_usr_pwd.place(x=120,y=155)
# 自定义用户登录函数
def usr_login():
# 获取用户输入的用户名和密码
usr_name = var_usr_name.get()
usr_pwd = var_usr_pwd.get()
# 异常捕获,因第一次使用,文件usrs_info.pickle是不存在的,所以要设置异常捕获
try:
with open('usrs_info.pickle', 'rb') as usr_file:# 程序将输入的信息和文件中的信息匹配。
usrs_info = pickle.load(usr_file)
except FileNotFoundError:#异常
# 程序第一次没有读取到`usr_file.pickle`的时候,会创建一个`usr_file.pickle`这个文件,并将管理员
# 的用户和密码写入,即用户名为`admin`密码为`admin`。
with open('usrs_info.pickle', 'wb') as usr_file:
usrs_info = {'admin': 'admin'}
pickle.dump(usrs_info, usr_file)
# 关闭文件
usr_file.close()
# 如果用户名和密码与文件中的匹配成功,则会在弹窗中提示登录成功。
if usr_name in usrs_info:
if usr_pwd == usrs_info[usr_name]:
tkinter.messagebox.showinfo(title='登录成功', message='亲爱的用户' + usr_name+',感谢您使用本系统!')
# 如果用户名匹配成功,而密码输入错误,则会弹出'您输入的密码错误,请再次尝试输入!'
else:
tkinter.messagebox.showerror(message='您输入的密码错误,请再次尝试输入!')
else: # 如果用户不存在,提示注册后再登录
is_sign_up = tkinter.messagebox.askyesno('您还没有注册,', '请先注册后再重新登录。 现在就去注册吗?')
# 提示需不需要注册新用户
if is_sign_up:
usr_sign_up()
# 自定义用户注册函数
def usr_sign_up():
def sign_to_sys():
# 获取注册信息:用户名,密码,重复密码
nn = new_name.get()
np = new_pwd.get()
npf = new_pwd_confirm.get()
with open('usrs_info.pickle', 'rb') as usr_file:## 打开登录数据文件
exist_usr_info = pickle.load(usr_file)#读取注册信息
# 判断两次密码输入是否一致,如果不一致,则提示错误
if np != npf:
tkinter.messagebox.showerror('输入错误!', '两次输入的密码必须一致!')
# 如果用户名已经注册过,则提示此用户已经注册!
elif nn in exist_usr_info:
tkinter.messagebox.showerror('输入错误!', '此用户名已经注册!')
# 注册信息核验成功,则将注册输入的信息写入文件,并提示注册成功,销毁窗口。
else:
exist_usr_info[nn] = np
with open('usrs_info.pickle', 'wb') as usr_file:
pickle.dump(exist_usr_info, usr_file)
tkinter.messagebox.showinfo('恭喜,', '您已成功注册为系统用户,感谢使用!')
# 销毁窗口
window_sign_up.destroy()
# 定义长在窗口上的窗口
window_sign_up = tk.Toplevel(window)
window_sign_up.geometry('300x200')
window_sign_up.title('用户注册')
new_name = tk.StringVar() # 将输入的注册名赋值给变量
new_name.set('shenhaicyg@.com') # 将最初显示定为'shenhaicyg@.com'
tk.Label(window_sign_up, text='设置用户名: ').place(x=10, y=10) # 将`User name:`放置在坐标(10,10)。
entry_new_name = tk.Entry(window_sign_up, textvariable=new_name) # 创建一个注册名的`entry`,变量为`new_name`
entry_new_name.place(x=130, y=10) # `entry`放置在坐标(130,10).
new_pwd = tk.StringVar()
tk.Label(window_sign_up, text='设置密码: ').place(x=10, y=50)
entry_usr_pwd = tk.Entry(window_sign_up, textvariable=new_pwd, show='*')
entry_usr_pwd.place(x=130, y=50)
new_pwd_confirm = tk.StringVar()
tk.Label(window_sign_up, text='再次输入密码: ').place(x=10, y=90)
entry_usr_pwd_confirm = tk.Entry(window_sign_up, textvariable=new_pwd_confirm, show='*')
entry_usr_pwd_confirm.place(x=130, y=90)
# 下面的 sign_to_sys
btn_comfirm_sign_up = tk.Button(window_sign_up, text='立即注册', command=sign_to_sys)
btn_comfirm_sign_up.place(x=180, y=120)
# 登录和注册按钮
btn_login = tk.Button(window, text='立即登录', command=usr_login)
btn_login.place(x=120, y=200)
btn_sign_up = tk.Button(window, text='我要注册', command=usr_sign_up)
btn_sign_up.place(x=200, y=200)
# 窗口循环显示
window.mainloop()
四、代码解释
程序的第5至第7行为导入相应的模块。
第10行为实例化tkinter窗体window.
第13至37行为窗体各控件的布局及参数设置。
第40至69行为自定义用户登录函数。第49至56行为一个异常捕获模块,因为在系统第一次运行时,系统里没有用户登录文件,所以我们要在函数中内置了一个异常捕获try……except语句,用于捕获当用户名不存在时系统出现的异常,并利用except块语句自动创建一个默认的用户名和密码为admin的登录文件。第59至69行为用户登录的判断语句,用于判断用户输入的用户名和密码。
第72至121行为自定义用户注册函数,用于实现用户注册的相应功能。
第124至127行为实例化登录和注册按钮。
五、运行
1、在新窗体中绘制用户登录窗体,默认的登录名为shenhaicyg@163.com

2、当第一次运行系统时,会自动创建用户数据文件:

无用户数据文件:
当运行登录系统后,自动创建了一个名为usrs_info.pickle的数据文件:

3、如果系统未匹配到用户,会弹出提示框提示用户注册:


当点击“是”按钮后,弹出注册对话框:

注册成功:

注册成功后再次登录系统:

下一篇:《Python程序开发之简单小程序实例(11)》
更多精彩内容将在以后的章节分享给朋友们,请添加好友至收藏,欢迎点赞并关注后期内容更新!