python——井字棋游戏——登入注册界面

server/2024/11/23 17:09:59/

本篇文章只讲解登入和注册页面,在后面的文章中会讲解井字棋游戏,然后把井字棋和登入界面进行连接,整合成一个完整的游戏

登入注册界面在本篇文章的末尾。

1.实现登入界面

(1)导入图片在这里插入图片描述

把这张图片存储在与代码路径一样的文件夹,并取名为welcome,该图片是gif格式。
先创建个窗口,然后把图片绘制到里面。

代码:
python">import tkinter as tk
window = tk.Tk()
window.title("Welcome")
window.geometry("600x400")logo = tk.PhotoImage(file="image/welcome.gif")
label = tk.Label(window, image=logo)
label.pack()window.mainloop()

运行结果如下:
在这里插入图片描述

(2)设置窗口输入框和按钮

在窗口图片下面设置名字和密码以及相应的输入框,还有登入注册按钮。

代码:
python">t1 = tk.Label(window, text="User name")
t1.place(x=70, y=130)
label_title1 = tk.Entry(window, bd=5)
label_title1.pack(padx=10, pady=5)
t2 = tk.Label(window, text="Password")
t2.place(x=70, y=180)
label_title2 = tk.Entry(window, bd=5)
label_title2.pack(padx=10, pady=5)button1 = tk.Button(window, text="登入", width=10, height=2, fg='black')
button1.place(x=180, y=250)
button2 = tk.Button(window, text="注册", width=10, height=2, fg='black')
button2.place(x=350, y=250)

运行结果如下:
在这里插入图片描述

2.实现注册窗口

(1)设置注册窗口的输入框和标签

定义函数把注册框的注册窗口都放置在函数中

python">def usr_sign_up():print('开始注册')
# 注册窗口
win = tk.Toplevel(window)
win.title("Sign up window")
win.geometry("300x200")
lb1_title2 = tk.Label(win, text='User name:')
lb1_title2.grid(row=0, column=0)
e1 = tk.Entry(win, bd=5, width=10)
e1.grid(row=0, column=2)
lb2 = tk.Label(win, text='Password:')
lb2.grid(row=1, column=0)
e2 = tk.Entry(win, bd=5, width=10)
e2.grid(row=1, column=2)
lb3 = tk.Label(win, text='Confirm password:')
lb3.grid(row=2, column=0)
e3 = tk.Entry(win, bd=5, width=10)
e3.grid(row=2, column=2)
button_z = tk.Button(win, text="Sign up",command=sign_up)
button_z.grid(row=4, column=2)

我们还需要把注册界面的函数连接到登录界面的按钮中

python">button2 = tk.Button(window, text="注册", width=10, height=2, fg='black',command=usr_sign_up)
button2.place(x=350, y=250)

这样我们点击登入窗口中的注册按钮就会弹出注册界面

(2)获取注册数据判断是否注册过

在这之前我们先在代码最上方导入两个模块,如下所示,我们再定义一个函数,检测三个输入框输入的值,如果输入框中两次输入的密码不一样则会弹出提示,如果注册过也会弹出提示,如果注册成功会提示你注册成功,最后销毁窗口。
1.import tkinter.messagebox:
导入了tkinter.messagebox模块,该模块提供了对话框和消息框的功能,用于在GUI应用程序中显示消息、警告或确认对话框等。常见的方法包括showinfo()、showwarning()、showerror()等,用于显示不同类型的消息框。
2.import pickle:
这行代码导入了pickle模块,pickle模块是Python中用于序列化和反序列化对象的模块。通过pickle模块,可以将对象转换为字节流进行存储或传输,也可以从字节流中恢复对象。pickle模块提供了dump()、load()等方法来实现对象的序列化和反序列化操作。

代码:
python">import tkinter.messagebox
import pickle
python">def sign_up():#获取输入nn = e1.get()np = e2.get()npf =e3.get()#读取后台数据with open('usrs_info.pickle', 'rb') as usr_file:#从usr_file文件中加载数据,将其反序列化为Python对象,并将结果存储在exist_usr_info变量中。exist_usr_info = pickle.load(usr_file)#判断两次输入的密码是否一致if np != npf:tk.messagebox.showerror('Error','Password and confirm password must be the same')#判断用户名是否已经注册过elif nn in exist_usr_info:print('已经注册过了')tk.messagebox.showerror('Error','The user has already signed up')#注册成功,写入后台else:exist_usr_info[nn] = npwith open('user_info.pickle', 'wb') as usr_file:pickle.dump(exist_usr_info, usr_file)tk.messagebox.showinfo('Welcome','You have successfully signed up')# 销毁窗口win.destroy()

在注册界面的按钮中导入此函数,在注册时好进行判断
在这里插入图片描述
以下是代码运行的结果:
在这里插入图片描述

3.定义登入按钮

当用户通过输入框输入用户名和密码。尝试打开一个名为文件,如果文件存在,则加载其中的用户信息数据到文件中。如果文件不存在则创建一个默认的用户信息字典并将其序列化写入文件中。检查用户输入的用户名是否在用户信息字典中。如果用户名存在,检查用户输入的密码是否与用户名对应的密码匹配。如果密码匹配,显示欢迎消息框,如果密码不匹配,显示密码错误的错误消息框。如果用户名不存在,显示询问框询问用户是否要注册。如果用户选择注册,调用usr_sign_up()函数进行注册操作。

代码:
python">def usr_login():#获取输入框label_title1中用户输入的用户名,并将其存储在usr_name变量中。usr_name = label_title1.get()#获取输入框label_title2中用户输入的密码,并将其存储在usr_pwd变量中。usr_pwd = label_title2.get()print(usr_name)try:#打开名为usrs_info.pickle的文件,以二进制只读模式打开,并将文件对象赋给usr_file变量。with open('usrs_info.pickle', 'rb') as usr_file:print('1')#从usr_file文件中加载数据,将其反序列化为Python对象,并将结果存储在usrs_info变量中。usrs_info = pickle.load(usr_file)print(usrs_info)except FileNotFoundError:with open('usrs_info.pickle', 'wb') as usr_file:print('2')usrs_info = {'admin': 'admin'}#将usrs_info字典序列化并写入usr_file文件。pickle.dump(usrs_info, usr_file)  # 序列化print('OK')print('usr_name:', usr_name)if usr_name in usrs_info:print('3')if usr_pwd == usrs_info[usr_name]:tk.messagebox.showinfo(title='Welcome', message='How are your?' + usr_name)window.destroy()subprocess.Popen(["python", "demo3.py"])# main()else:#显示一个错误框,提示用户密码错误。tk.messagebox.showerror(message='Error,your password is wrong,try again.')else:#显示一个询问框,询问用户是否要注册。is_sign_up = tk.messagebox.askyesno(title='Welcome', message='You have not sign up yet.Sign up today?')if is_sign_up:usr_sign_up()

以下是运行结果:
在这里插入图片描述
完整代码如下:

python">import tkinter as tk
import tkinter.messagebox
import pickle
import subprocesswindow = tk.Tk()
window.title("Welcome")
window.geometry("600x400")
logo = tk.PhotoImage(file="image/welcome.gif")
label = tk.Label(window, image=logo)
label.pack()
t1 = tk.Label(window, text="User name")
t1.place(x=70, y=130)
label_title1 = tk.Entry(window, bd=5)
label_title1.pack(padx=10, pady=5)
t2 = tk.Label(window, text="Password")
t2.place(x=70, y=180)
label_title2 = tk.Entry(window, bd=5)
label_title2.pack(padx=10, pady=5)def usr_login():#获取输入框label_title1中用户输入的用户名,并将其存储在usr_name变量中。usr_name = label_title1.get()#获取输入框label_title2中用户输入的密码,并将其存储在usr_pwd变量中。usr_pwd = label_title2.get()print(usr_name)try:#打开名为usrs_info.pickle的文件,以二进制只读模式打开,并将文件对象赋给usr_file变量。with open('usrs_info.pickle', 'rb') as usr_file:print('1')#从usr_file文件中加载数据,将其反序列化为Python对象,并将结果存储在usrs_info变量中。usrs_info = pickle.load(usr_file)print(usrs_info)except FileNotFoundError:with open('usrs_info.pickle', 'wb') as usr_file:print('2')usrs_info = {'admin': 'admin'}#将usrs_info字典序列化并写入usr_file文件。pickle.dump(usrs_info, usr_file)  # 序列化print('OK')print('usr_name:', usr_name)if usr_name in usrs_info:print('3')if usr_pwd == usrs_info[usr_name]:tk.messagebox.showinfo(title='Welcome', message='How are your?' + usr_name)else:#显示一个错误框,提示用户密码错误。tk.messagebox.showerror(message='Error,your password is wrong,try again.')else:#显示一个询问框,询问用户是否要注册。is_sign_up = tk.messagebox.askyesno(title='Welcome', message='You have not sign up yet.Sign up today?')if is_sign_up:usr_sign_up()def usr_sign_up():print('开始注册')def sign_up():#获取输入nn = e1.get()np = e2.get()npf =e3.get()#读取后台数据with open('usrs_info.pickle', 'rb') as usr_file:#从usr_file文件中加载数据,将其反序列化为Python对象,并将结果存储在exist_usr_info变量中。exist_usr_info = pickle.load(usr_file)#判断两次输入的密码是否一致if np != npf:tk.messagebox.showerror('Error','Password and confirm password must be the same')#判断用户名是否已经注册过elif nn in exist_usr_info:print('已经注册过了')tk.messagebox.showerror('Error','The user has already signed up')#注册成功,写入后台else:exist_usr_info[nn] = npwith open('user_info.pickle', 'wb') as usr_file:pickle.dump(exist_usr_info, usr_file)tk.messagebox.showinfo('Welcome','You have successfully signed up')# 销毁窗口win.destroy()#注册窗口win = tk.Toplevel(window)win.title("Sign up window")win.geometry("300x200")lb1_title2 = tk.Label(win, text='User name:')lb1_title2.grid(row=0, column=0)e1 = tk.Entry(win, bd=5, width=10)e1.grid(row=0, column=2)lb2 = tk.Label(win, text='Password:')lb2.grid(row=1, column=0)e2 = tk.Entry(win, bd=5, width=10)e2.grid(row=1, column=2)lb3 = tk.Label(win, text='Confirm password:')lb3.grid(row=2, column=0)e3 = tk.Entry(win, bd=5, width=10)e3.grid(row=2, column=2)button_z = tk.Button(win, text="Sign up", command=sign_up)button_z.grid(row=4, column=2)button1 = tk.Button(window, text="登入", width=10, height=2, fg='black',command=usr_login)
button1.place(x=180, y=250)
button2 = tk.Button(window, text="注册", width=10, height=2, fg='black',command=usr_sign_up)
button2.place(x=350, y=250)window.mainloop()

http://www.ppmy.cn/server/20908.html

相关文章

密码学系列7-变幻多端的安全性证明

安全性模型并不是一尘不变的。前几篇文章给出的安全性证明基本沿用了系列2中的安全性模型。但安全性模型会随着方案的不同而发生变化。 本章给出两个安全性证明的例子,让读者感受如何定义安全需求并设计安全性证明。 一、基于身份的加密(IBE) IBE是传统公钥加密的变体。IBE…

基于单片机公交语音报站系统设计 含源码,Proteus仿真原理图

资料下载地址:基于单片机公交语音报站系统设计 含源码,Proteus仿真原理图 1、前言 系统的总体设计需要充分运用STC单片机作为主控控制芯片,完成主控控制电路的基本设计,辅助控制电路是语音控制电路、12864显示电路、按键控制电路、…

matlab回归学习

前言 所谓回归学习即预测,便是由已知的数据推测未知的数据,利用转速与转矩来推测电流。 1、数据准备 下面虚拟一组转速转矩以及电流数据。 speed [100 220 330 440 550 660]; torque [200 300 400 500 700 900]; I [400 500 603 739 821 912]; arr …

HTTP的MIME 类型(2024-04-27)

1、简介 MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。 MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。 浏览器通常使用 MIME 类型(而不是文件扩展名&…

test-demo-record

常规 ApiOperation(value "发送短信")PostMapping("/test/sendSms")ActionLog(action "发送短信", remark "发送短信")public R sendSms(Valid RequestBody SendSmsREQ req , RequestHeader("Tenant-Id") String tenant…

Elasticsearch进阶篇(三):ik分词器的使用与项目应用

ik分词器的使用 一、下载并安装1.1 已有作者编译后的包文件1.2 只有源代码的版本1.3 安装ik分词插件 二、ik分词器的模式2.1 ik_smart演示2.2 ik_max_word演示2.3 standard演示 三、ik分词器在项目中的使用四、ik配置文件4.1 配置文件的说明4.2 自定义词库 五、参考链接 一、下…

mmdetection3.1.0 bug(已解决)

mmdetection版本3.1.0 想这训练rpn网络,但是训练后val的时候出现了问题,根据Traceback,找到bug。 报错信息:ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dim…

全视通智慧手术室对讲方案,让手术更安全更高效

在医疗领域,手术室是挽救生命、治疗疾病的前线阵地。随着科技的不断进步,传统的手术室正在经历一场革命性的变革。作为一家专业的智慧医康养解决方案提供商,全视通深知手术室沟通的重要性,因此研发出一套集高效、精准、智能于一体…