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

news2024/10/5 16:24:55

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

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

1.实现登入界面

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

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

代码:
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)设置窗口输入框和按钮

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

代码:
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)设置注册窗口的输入框和标签

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

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)

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

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()等方法来实现对象的序列化和反序列化操作。

代码:
import tkinter.messagebox
import pickle
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] = np
        with 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()函数进行注册操作。

代码:
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()

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

import tkinter as tk
import tkinter.messagebox
import pickle
import subprocess

window = 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] = np
            with 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.coloradmin.cn/o/1630903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小程序的合同是怎么样写的

​很多商家找第三方做小程序都遭遇到了各种问题,如访问速度慢、服务器关闭、反复收费等。如果当初商家找的是正规的第三方服务商,双方签订了明确的合同条款,出现任何问题后,相信都能够进行解决。下面将具体介绍合同内容&#xff0…

面试高频:什么情况下要用到缓存?如何应对缓存穿透、击穿及雪崩?

一、为什么要使用内存数据库? 我们先来看一下以往单体的Web系统架构图是什么样的: 从图中可以看出,早期的单体架构基本上是以业务为导向,同时用户群体不是很大,这种单体的架构基本上可以应付大多数使用场景。但随着互…

Springboot+Vue项目-基于Java+MySQL的商业辅助决策系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

数据分析:生存分析原理和应用实例

介绍 生存分析的目的是分析某个时间点的“生存概率”是多少。基于这样的研究目的,需要提供生存数据,它是一种由不同的开始时间和结束时间组成的事件-时间的数据,比如在癌症研究领域,研究手术到死亡的过程、治疗到疾病进展等等。 在开展生存分析前,需要了解什么是删失(c…

博途安装【PLC】

1【安装】 mp.weixin.qq.com Pro功能强于Adv 关于Prof版本和Adv版本的区别,可以参考下图,专业版是包含高级版的,我们选择专业版进行安装 双击TIA_Portal_STEP7_Prof_Safety_WINCC_Prof_V16.exe进行安装 解压安装 如果电脑死循环重启&#…

Python-100-Days: Day05 Construct Program Logical

Python的核心语言元素: (变量、类型、运算符、表达式、分支结构、循环结构) 之后,必须做的一件事情就是尝试用所学知识去解决现实中的问题,换句话说就是锻炼自己把用人类自然语言描述的算法(解决问题的方法…

redis基础(一)

启动与关闭 启动命令在/usr/local/bin目录 服务端后台启动:redis-server opt/redis-6.2.1/redis.conf 客户端连接:执行 redis-cli 关闭操作 ​ 方式1:进入终端后关闭 ​ 方式2:直接kill 掉进程 方式3:通过实例关闭 …

蓝桥杯ctf2024 部分wp

数据分析 1. packet 密码破解 1. cc 逆向分析 1. 欢乐时光 XXTEA #include<stdio.h> #include<stdint.h> #define DELTA 0x9e3779b9 #define MX (((z>>5^y<<2)(y>>3^z<<4))^((sum^y)(key[(p&3)^e]^z))) void btea(unsigned int* v…

ElasticSearch自动补全

一、拼音分词器&#xff1a; 当用户在搜索框输入字符时&#xff0c;我们应该提示出与该字符有关的搜索项&#xff0c;如图&#xff1a; 这种根据用户输入的字母&#xff0c;提示完整词条的功能&#xff0c;就是自动补全了。 GET /_analyze {"text":"我爱螺蛳粉…

快手AI小快走红:评论区里的聊天艺术家,让百万用户欲罢不能!

快手官方推出的AI互动小助手「AI小快」在短视频平台上掀起了一股热潮。那么&#xff0c;这个被誉为“评论区著名聊天艺术家”的AI小快究竟有何魅力呢&#xff1f;让我们一起来看看吧&#xff01; AI-321 | 专注全球AI工具推荐的网站 AI工具集 | 人工智能工具箱 | 全球顶尖AI工…

电磁兼容(EMC):详解压敏电阻的防静电性能如何

目录 1. 压敏电阻性能 2. 静电放电性能评价指标 3. 压敏电阻防静电实验数据 4. 总结 压敏电阻是一种防浪涌型保护器件&#xff0c;常用在防雷击浪涌以及电网浪涌电压的保护电路中。那压敏电阻的防静电性能如何呢&#xff1f;能不能像防电涌那般防住静电放电能量&#xff1f;…

回溯算法练习day.5

491.非递减子序列 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重…

2024全国大学生高新技术竞赛——算法智星挑战赛 解题报告(流水账版) | 珂学家

前言 评价 因为第一届的缘故吧&#xff0c;导致这场比赛异常的简单。所以不太好评价这块。 怎么说呢&#xff1f; 体验有点差 题目难度没有区分度有两题还存在SPJ判定问题&#xff0c;导致赛时没一人过。 题目分布&#xff0c;简单题占大部分&#xff0c;中等级占一小部分&…

【Linux】HTTP协议1

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 目录 &#x1f449;&#x1f3fb;http概念初识http协议格式 &#x1f449;&#x1f3fb;URL&#x1f449;&#x1f3fb;简单实现http协议&#xff…

5G前传光纤传输的25G光模块晶振SG2016CAN

一款适用于5G前传光纤传输网络中的25G光模块的5G晶振SG2016CAN。随着5G时代的到来&#xff0c;5G晶振的重要性也不言而喻&#xff0c;小体积宽温晶振SG2016CAN可以用于5G前传的25G光模块&#xff0c;具有高稳定性、小体积、宽温等优势。在5G前传光纤传输网络中&#xff0c;25G光…

java.sql.SQLDataException: Cannot determine value type from string 报错

报错 "org.springframework.dao.DataIntegrityViolationException: Error attempting to get column title from result set. Cause: java.sql.SQLDataException: Cannot determine value type from string 标题\n; Cannot determine value type from string 标题; neste…

ssm089理发店会员管理系统的设计和实现+vue

理发店会员管理系统的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和…

Redis入门到通关之数据结构解析-SkipList

文章目录 ☃️概述☃️总结 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端开发者。 博客特色&…

Python_AI库 Pandas在商业环境中的实际用途

Python_AI库 Pandas在商业环境中的实际用途 在前文中我们介绍了Pandas的各种常见操作&#xff0c;由于Pandas提供了高效、灵活且易于使用的数据结构&#xff0c;使得数据处理、清洗、分析和可视化变得更为简单&#xff0c;因此它广泛应用于各种商业应用中。 我们学习一个工具…

如何在Windows 10上刷新DNS?这里提供详细步骤

电脑的DNS缓存出现问题可能会导致连接到互联网时出现问题。如果你尝试过清除浏览器缓存和cookie等常见技巧&#xff0c;刷新Windows 10的DNS可能会解决你的问题。 DNS缓存的作用是什么 域网络系统&#xff08;DNS&#xff09;服务器将熟悉的域名转换为计算机用来相互连接的IP…