py注册登录界面
代码分析
-
引入tkinter库,并从中导入
messagebox
模块。 -
read_users()
函数用于读取存储用户信息的文本文件"users.txt"。它打开文件并逐行读取,将每行的用户名和密码以空格分隔后存储在一个列表中,最后返回该列表。 -
login(username, password)
函数用于验证用户输入的用户名和密码是否与已存储的用户信息匹配。它调用read_users()
函数获取所有用户信息,并遍历该列表。如果找到匹配的用户名和密码,返回True;否则返回False。 -
on_login_click()
函数是登录按钮的回调函数。它首先获取用户输入的用户名和密码,然后进行非空检查。如果用户名或密码为空,将在界面显示"用户名或密码不能为空!"的错误提示信息。否则,调用login()
函数进行验证。如果验证通过,弹出一个登录成功的消息框,并清空之前可能存在的错误提示信息;否则,在界面上显示"用户名或密码错误"的提示信息。 -
exit()
函数是退出按钮的回调函数。它调用root.destroy()
方法销毁GUI窗口,结束程序运行。 -
创建一个名为"登录界面"的GUI窗口对象
root
。 -
创建一个欢迎标签
welcome_label
,设置其文本为"欢迎登录系统",使用Helvetica字体,字号为16,并将其放置在第0行、第0和1列。 -
创建用户名标签
name
、用户名输入框userid
、密码标签ps
、密码输入框userps
,并使用网格布局放置在相应的位置。 -
创建登录按钮
lobutton
,设置其文本为"登录",并将回调函数设置为on_login_click()
。 -
创建退出按钮
exbutton
,设置其文本为"退出",并将回调函数设置为exit()
。 -
创建用于显示验证结果的标签
rebutton
,使用result_var
变量绑定该标签的文本内容。 -
使用网格布局将上述部件放置在相应的位置。
-
调用
root.mainloop()
进入事件循环,等待用户交互。
import tkinter as tk
from tkinter import messageboxdef read_users():users = []with open("users.txt", "r") as file:for line in file:user_info = line.strip().split(' ')users.append(user_info)return usersdef login(username, password):users = read_users()for user in users:if user[0] == username:if user[1] == password:return Trueelse:return Falsereturn Falsedef on_login_click():username = userid.get()password = userps.get()if not username or not password:result_var.set("用户名或密码不能为空!")else:if login(username, password):messagebox.showinfo("登录成功", "登录成功!")result_var.set("") # Clear any previous error messageelse:result_var.set("用户名或密码错误")def exit():root.destroy()root = tk.Tk()
root.title("登录界面")welcome_label = tk.Label(root, text="欢迎登录系统", font=("Helvetica", 16))welcome_label.grid(row=0, column=0, columnspan=2, pady=10)name = tk.Label(root, text="用户名:")
userid = tk.Entry(root)
ps = tk.Label(root, text="密码:")
userps = tk.Entry(root, show="*")lobutton = tk.Button(root, text="登录", command=on_login_click)
exbutton = tk.Button(root, text="退出", command=exit)# 记录字符串的,用于验证结果怎么样,我可以使用遍历来查找
result_var = tk.StringVar()rebutton = tk.Label(root, textvariable=result_var)name.grid(row=2, column=0, padx=10, pady=5, sticky=tk.E)
userid.grid(row=2, column=1, padx=10, pady=5)
ps.grid(row=3, column=0, padx=10, pady=5, sticky=tk.E)
userps.grid(row=3, column=1, padx=10, pady=5)
lobutton.grid(row=4, column=0, padx=5, pady=10, sticky=tk.SW)
exbutton.grid(row=4, column=1, padx=5, pady=10, sticky=tk.SE)
rebutton.grid(row=5, column=0, columnspan=2, pady=5)root.mainloop()
分析
- 首先导入了
tkinter
库,用于创建GUI界面。 - 创建了一个名为
get_movie_info()
的函数,用于获取豆瓣电影Top250的电影信息。该函数使用requests
库发送HTTP GET请求,并通过解析返回的HTML内容使用BeautifulSoup
类提取电影名称、评分和评价人数。最后返回包含电影信息的列表。 - 创建了一个名为
save_to_csv()
的函数,用于将电影信息保存到CSV文件中。该函数使用csv
库打开指定文件并创建一个CSV写入器,然后逐行写入电影信息。 - 在主程序中,定义了一个名为
url
的变量,存储要爬取的豆瓣电影Top250页面的URL。 - 创建了一个名为
root
的窗口对象,并设置了窗口标题和大小。 - 创建了一个名为
movies_text
的文本框,用于显示电影信息。 - 创建了一个名为
get_movies_button
的按钮,用于触发获取电影信息的操作。点击按钮后,调用get_movie_info()
函数获取电影信息,并将其显示在movies_text
文本框中。 - 创建了一个名为
save_movies_button
的按钮,用于触发保存电影信息的操作。点击按钮后,调用save_to_csv()
函数将电影信息保存到名为"top250.csv"的CSV文件中。 - 使用
grid()
方法将上述部件放置在窗口中的相应位置。 - 调用
root.mainloop()
进入GUI界面的事件循环,等待用户交互。
import tkinter as tk
from tkinter import messageboxdef read_users():with open("users.txt", "r") as file:lines = file.readlines()users = [line.strip().split(' ') for line in lines]return usersdef register(username, password, confirm_password):if not username or not password or not confirm_password:return "用户名或密码不能为空!"if password != confirm_password:return "两次密码不一致!"users = read_users()for user in users:if user[0] == username:return "用户名已存在!"with open("users.txt", "a") as file:file.write(f"{username} {password}\n")return "注册成功"def on_register_click():username = entry_username.get()password = entry_password.get()confirm_password = entry_confirm_password.get()result = register(username, password, confirm_password)result_var.set(result)def on_exit_click():root.destroy()root = tk.Tk()
root.title("注册界面")label_username = tk.Label(root, text="用户名:")
entry_username = tk.Entry(root)
label_password = tk.Label(root, text="密码:")
entry_password = tk.Entry(root, show="*")
label_confirm_password = tk.Label(root, text="确认密码:")
entry_confirm_password = tk.Entry(root, show="*")register_button = tk.Button(root, text="注册", command=on_register_click)
exit_button = tk.Button(root, text="退出", command=on_exit_click)result_var = tk.StringVar()
result_label = tk.Label(root, textvariable=result_var)label_username.grid(row=0, column=0, padx=10, pady=5, sticky=tk.E)
entry_username.grid(row=0, column=1, padx=10, pady=5)
label_password.grid(row=1, column=0, padx=10, pady=5, sticky=tk.E)
entry_password.grid(row=1, column=1, padx=10, pady=5)
label_confirm_password.grid(row=2, column=0, padx=10, pady=5, sticky=tk.E)
entry_confirm_password.grid(row=2, column=1, padx=10, pady=5)
register_button.grid(row=3, column=0, padx=5, pady=10, sticky=tk.SW)
exit_button.grid(row=3, column=1, padx=5, pady=10, sticky=tk.SE)
result_label.grid(row=4, column=0, columnspan=2, pady=5)root.mainloop()
相关文章:
py注册登录界面
代码分析 引入tkinter库,并从中导入messagebox模块。 read_users()函数用于读取存储用户信息的文本文件"users.txt"。它打开文件并逐行读取,将每行的用户名和密码以空格分隔后存储在一个列表中,最后返回该列表。 login(username,…...

基于电商场景的高并发RocketMQ实战-Consumer端队列负载均衡分配机制、并发消费以及消费进度提交
🌈🌈🌈🌈🌈🌈🌈🌈 【11来了】文章导读地址:点击查看文章导读! 🍁🍁🍁🍁🍁🍁dz…...

【Java开发岗面试】八股文—数据库MySQLRedis
声明: 背景:本人为24届双非硕校招生,已经完整经历了一次秋招,拿到了三个offer。本专题旨在分享自己的一些Java开发岗面试经验(主要是校招),包括我自己总结的八股文、算法、项目介绍、HR面和面试…...

IntelliJ IDEA [设置] 隐藏 .idea 等 .XXX 文件夹
文章目录 1. 问题描述2. 解决办法3. 最后效果4. 特殊处理(正常不需要此步骤)总结 我们使用 IntelliJ IDEA 导入项目的时候,经常会看到一些 .XXX 的文件夹(例如:.idea,.mvn,.gradle 等࿰…...

每日一题——LeetCode961
方法一 排序法: 2*n长度的数组里面有一个元素重复了n次,那么将数组排序,求出排序后数组的中间值(因为长度是偶数,没有刚好的中间值,默认求的中间值是偏左边的那个)那么共有三种情况:…...
基于Unity Editor开发一个技能编辑器可能涉及到的内容
基于Unity Editor开发一个技能编辑器,涉及到的方面较多,涵盖了Unity自身的GUI框架、序列化系统、自定义编辑器、脚本调用与数据存储等。下面是几个关键点和你可能会用到的类以及API: 自定义Inspector: 使用Editor类来重写组件的I…...

Ubuntu 22.04 安装ftp实现与windows文件互传
Ubuntu 22.04 安装ftp实现与windows文件互传 1、配置安装 安装: sudo apt install vsftpd -y使能开机自启: sudo systemctl enable vsftpd 启动: sudo systemctl start vsftpd创建ftp工作目录: sudo mkdir -p /home/ftp/uftp…...

EasyPoi使用案例
EasyPoi使用案例 easypoi旨在简化Excel和Word的操作。基于注解的导入导出,修改注解就可以修改Excel;支持常用的样式自定义;基于map可以灵活定义表头字段;支持一对多的导入导出;支持模板的导出;支持HTML/Exc…...

分布式系统架构设计之分布式数据存储的分类和组合策略
在现下科技发展迅猛的背景下,分布式系统已经成为许多大规模应用和服务的基础架构。分布式架构的设计不仅仅是一项技术挑战,更是对数据存储、管理和处理能力的严峻考验。随着云原生、大数据、人工智能等技术的崛起,分布式系统对于数据的高效存…...

javaEE -18(11000字 JavaScript入门 - 3)
一:事件 (高级) 1.1 注册事件(绑定事件) 给元素添加事件,称为注册事件或者绑定事件,注册事件有两种方式:传统方式和方法监听注册方式 传统注册方式 : 利用 on 开头的…...
LangChain.js 实战系列:入门介绍
📝 LangChain.js 是一个快速开发大模型应用的框架,它提供了一系列强大的功能和工具,使得开发者能够更加高效地构建复杂的应用程序。LangChain.js 实战系列文章将介绍在实际项目中使用 LangChain.js 时的一些方法和技巧。 LangChain.js 是一个…...

pyCharm 打印控制台中文乱码解决办法
解决方法 在 "File" -> "Settings" 中的控制台设置: 在 "File" -> "Settings" 中,你可以找到 "Editor" -> "General" -> "Console"。在这里,你可能会找到…...
计算机基础--Linux详解
一概述 Linux是一种自由和开放源码的类UNIX操作系统。它是由林纳斯托瓦兹于1991年首次发布的,并从那时起在全球范围内得到了广泛的应用和开发。Linux具有强大的可定制性,可以运行在各种硬件平台上,包括x86、ARM、MIPS等。它不仅广泛应用于服…...

基于OpenAI的Whisper构建的高效语音识别模型:faster-whisper
1 faster-whisper介绍 faster-whisper是基于OpenAI的Whisper模型的高效实现,它利用CTranslate2,一个专为Transformer模型设计的快速推理引擎。这种实现不仅提高了语音识别的速度,还优化了内存使用效率。faster-whisper的核心优势在于其能够在…...
cfa一级考生复习经验分享系列(十六)
写在前面:并不鼓励大家在考前一个月才开始复习,不过,既然已经逼到了绝境,灰心丧气也没有用,不如放手一搏! 首先说一下我的背景,工作金融机构的it,和cfa基本没关系,本硕计…...

数模学习day05-插值算法
插值算法有什么作用呢? 答:数模比赛中,常常需要根据已知的函数点进行数据、模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,“模拟产生”一些…...
hive中struct相关函数总结
目录 hive官方函数解释示例实战 hive官方函数解释 hive官网函数大全地址:添加链接描述 Return TypeNameDescriptionstructstruct(val1, val2, val3, …)Creates a struct with the given field values. Struct field names will be col1, col2, …structnamed_str…...

macos下转换.dmg文件为 .iso .cdr文件的简单方法
为了让镜像文件在mac 和windows平台通用, 所以需要将.dmg格式的镜像文件转换为.iso文件, 转换方法也非常简单, 一行命令即可 hdiutil convert /path/to/example.dmg -format UDTO -o /path/to/example.iso 转换完成后的文件名称默认是 example.iso.cdr 这里直接将.cdr后缀删…...

ALSA学习(5)——设备中的alsa
参考博客: https://blog.csdn.net/DroidPhone/article/details/7165482 (一下内容基本是原博主的博客转载) 文章目录 一、ASOC的由来二、硬件架构三、软件架构四、数据结构五、内核对ASoC的改进 一、ASOC的由来 ASoC–ALSA System on Chip …...

uniapp中组件库的丰富NumberBox 步进器的用法
目录 基本使用 #步长设置 #限制输入范围 #限制只能输入整数 #禁用 #固定小数位数 #异步变更 #自定义颜色和大小 #自定义 slot API #Props #Events #Slots 基本使用 通过v-model绑定value初始值,此值是双向绑定的,无需在回调中将返回的数值重…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...