用Python做一款带用户界面本地通讯桌面软件 (一:用户登录与注册)
前言:
从20119年10月份接触Python以来,也有将近有大半年的时间了。在这之前,和编程毫无接触,大学计算机二级都没过…。这大半年的学习主要是通过书籍,视频等方式进行学习,学到的最多的应该是在淘宝买的某培训机构的Python课程。
主要学习了Python的基础语法,和一些网络编程,多任务编程,数据库等的基础知识。也利用了自己所学习到的编程方面的知识,给公司的常用软件做了个外挂程序。深感自身能力的不足,及自学编程者在做编程项目时的无力。所以想通过CSDN平台,用自己所学过的一些东西做点实战项目,一方面梳理自己所学,另一方面也想借此多结交一些想在自学Python路上走的更远一些的朋友。
废话不多说,这次主要想做一个带用户界面的本地通讯软件的练习项目。
即:在window系统下,建立一个可在局域网上使用,提供聊天,文件传输等功能的通讯软件。且该通讯软件需设置提供以上服务的GUI窗口,界面布局可参考PC端微信界面。
这篇博客实现的功能为:用户登录,用户注册。
1、效果图
(1):登录及注册
(2):记住登录状态
2、主要实现功能:
1、客服端登录页面实现功能:
1、检查是否存在已注册用户数据,如无用户数据,提醒注册。
2、用户只有输入用户名和密码时,登录按钮才为可点击状态。
2、登录时检查用户ID及密码,提示错误信息:用户不存在,密码错误。
3、提供记住用户名,用户密码,用户自动登录功能,并可以在三种模式下切换。
2、客户端注册页面实现功能:
1、用户注册,保存注册成功用户数据。
2、检验用户ID,ID只能为字母与数字,不允许中文或其他特殊字符。
3、检查注册用户ID是否已存在,存在时拒绝注册。
4、检查用户密码,用户密码为6-10为字母数字,且首位必须为大写字母。
5、检查两次输入密码是否相同,不相同则提示,拒绝注册。
6、收集用户其他数据,昵称,性别。为可选填对象。
7、如昵称信息未填写,自动分配一个昵称给用户,作为默认昵称。
3、主要技术点
1、Python基础知识:如基础语法,函数,类的继承,重写等。
2、PyQt基础控件的使用,页面布局,单选框,复选框的使用。
3、pyqtSignal 的使用,理解控件焦点事件。
4、PyQt 文本框校验器。
4、代码讲解
1、用户登录按钮设置
# 先设置登录按钮为不可点击状态,当用户输入用户名及密码时才变为可点击状态
self.login_button.setEnabled(False)
实现方法为: 让用户名及密码单行文本输入框的字符改变信号连接检查用户输入方法,只有当用户名及密码输入框中字符串均不为空时才让登录按钮为可点击状态。代码如下:
# 单行文本输入框初始化方法
def line_init(self):
# 设置提示语
self.name_line.setPlaceholderText('在此输入用户名')
self.password_line.setPlaceholderText('在此输入密码')
# 设置检查单行文本输入框输入状态
self.name_line.textChanged.connect(self.check_input)
self.password_line.textChanged.connect(self.check_input)
# 检查文本输入框方法
def check_input(self):
# 当用户名及密码输入框均有内容时,设置登录按钮为可点击状态,或者不可点击。
if self.name_line.text() and self.password_line.text():
self.login_button.setEnabled(True)
else:
self.login_button.setEnabled(False)
2、用户登录方法:
说明:由于这里还没有加上网络网络通讯,也就是还没写客户端,服务端。所以先以文件操作来演示用户登录操作,顺便也可以练习一下Python的官方模块pickle的文件操作。
# 登录按钮点击信号绑定槽函数
self.login_button.clicked.connect(self.do_login)
# 登录方法
def do_login(self):
# 获取用户输入的用户名及密码
name,password = self.name_line.text(),self.password_line.text()
# 向服务端发送登录请求
# ----这边先以读取一个本地文件作为试验,模拟登录系统----
try:
# 用Python自带模块pickle来进行文件读取操作,以rb方式读取文件
with open('../data/users.pkl','rb') as f:
users = pickle.load(f)
except:
QMessageBox.warning(self,'警告','暂无用户数据!请先注册!')
return
# -----------------模拟登录-----------------------
if name in users.keys():
if password == users[name][0]:
# 检查用户登录状态
self.check_login_state()
QMessageBox.information(self,'提示','登录成功!')
else:
QMessageBox.warning(self,'警告','密码错误!')
else:
QMessageBox.warning(self,'警告','用户不存在!')
3、密码显示
在正常的密码输入框内密码应该是掩码输入的,pyqt中也停供了两种掩码方式:
# 设置用户密码以掩码显示
# self.password_line.setEchoMode(QLineEdit.Password)
# 设置用户在输入时明文显示,控件焦点转移后掩码显示
self.password_line.setEchoMode(QLineEdit.PasswordEchoOnEdit)
解释:第一种(QLineEdit.Password)是用户输入时离开时均为圆圈的小点来显示。
第二种(QLineEdit.PasswordEchoOnEdit)是用户输入时,明文显示,离开时掩码显示。
4、用户登录页面状态
用户登录界面的用户登录状态,模拟大多数网站或软件登录界面,提供了:1、记住用户名,2、记住密码,3、自动登录,三种状态,用的是pyqt里的QCheckBox复选框按钮。
# 设置用户登录界面状态控件,复选框控件
self.remember_name = QCheckBox('记住用户名')
self.remember_password = QCheckBox('记住密码')
self.auto_login = QCheckBox('自动登录')
三个复选框初始化方法:
# 复选框初始化
def checkbox_init(self):
# 将三个复选框按钮状态变化信号分别绑定对应槽函数
self.remember_name.stateChanged.connect(
self.remember_name_func)
self.remember_password.stateChanged.connect(
self.remember_password_func)
self.auto_login.stateChanged.connect(self.auto_login_func)
分析: 将三个复选框按钮状态变化信号分别绑定对应槽函数。
# 登录界面,记住用户名方法
def remember_name_func(self):
if self.remember_name.isChecked():
name = self.name_line.text()
with open('./temp/login.pkl','wb') as f:
pickle.dump(name,f)
else:
with open('./temp/login.pkl','wb') as f:
pickle.dump(0,f)
# 登录界面,记住密码方法
def remember_password_func(self):
if self.remember_password.isChecked():
# 用户点击记住密码,用户名也必须记住,
# 所以记住用户名按钮也需被选中。
self.remember_name.setChecked(True)
# 登录界面信息。
data = [self.name_line.text(),self.password_line.text()]
with open('./temp/login.pkl','wb') as f:
pickle.dump(data,f)
# 登录界面,自动登录方法、
def auto_login_func(self):
if self.auto_login.isChecked():
data = [self.name_line.text(), self.password_line.text()]
with open('./temp/auto.pkl','wb') as f:
pickle.dump(data,f)
分析:
1、这里通过当复选框按钮被选中时或未选中时,分别保存对应的文件数据。
2、其中记住用户名复选按钮被选中时,保存字符串文件 login.pkl,未选中时保存整型数据文件 login.pkl。
3、记住密码复选按钮被选中时,保存列表数据文件 login.pkl。
4、自动登录保存列表文件 auto.pkl。
在创建登录页面类的初始化方法中调用读取保存文件方法,来实现记住状态的功能。代码如下:
# 登录页面信息初始化方法
def login_init(self):
# 尝试读取记住用户名,或记住用户密码保存文件数据
try:
with open('./temp/login.pkl','rb') as f:
data = pickle.load(f)
# 判断数据类型,
# 如果是字符串,及仅选中了记住用户名复选框
if isinstance(data,str):
self.name_line.setText(data)
self.remember_name.setChecked(True)
else:
self.name_line.setText(data[0])
self.password_line.setText(data[1])
self.remember_name.setChecked(True)
self.remember_password.setChecked(True)
except:
pass
# 尝试读取自动登录保存文件数据
try:
with open('./temp/auto.pkl','rb') as f:
data2 = pickle.load(f)