上一篇:Python 自定义模块和包设计英语生词本(文件版)-CSDN博客
紧接上一篇博文,当我们熟练掌握自定义模块和包、掌握文件的的读取与写入、掌握正则表达式内置模块"re"、掌握GUI(图形界面)的部分组件后,接着我们将要以上的知识点结合起来,设计一个GUI(图形界面)登录界面。且看我如何一步两步......完成设计吧。


- """
- 账户密码登录
- """
-
- # 通配符 '*'
- __all__ = ['main']
-
-
- # 获取验证码
- def getVerifyCode(object):
- from 小功能包.验证码 import verify_code
- object.set(verify_code.verify_code(6))
- return verify_code.verify_code(6)
-
-
- # 读取文件数据
- def readFileData():
- from 小功能包.文件操作 import ReadFileData as read
- data = read.readlinesData(userDataPath, [])
-
- if data != '文件不存在':
- global userData
- userData = data
-
-
- # 查找账户
- def findID(id):
- readFileData() # 读取文件数据
-
- # 查找账户
- for i in userData:
- if i.strip('\n').split(' ')[0] == id:
- return i.strip('\n').split(' ')
-
- return None
-
-
- # 账户登录
- def IDenter(ID, password, inputVerify, verifyCode, label):
- # print(ID.get(), password.get(), inputVerify.get(), verifyCode.get(), label.get())
- # 查找账户是否存在
- data = findID(ID.get())
-
- # 校对账户
- if data:
- # 校对密码
- if data[1] == password.get():
- # 校对验证码
- import re
- if re.findall(verifyCode.get(), inputVerify.get(), re.I):
- label.set('登录成功')
- # 初始化输入框
- ID.set('')
- password.set('')
- inputVerify.set('')
- # 验证码输入错误
- else:
- label.set('验证码输入错误')
- inputVerify.set('')
- # 密码输入错误
- else:
- label.set('密码输入错误')
- password.set('')
- # 账户输入错误
- else:
- label.set('账户名输入错误')
- ID.set('')
-
- getVerifyCode(verifyCode) # 更新验证码
-
-
- # 账户注册
- def IDregister(ID, password, inputVerify, verifyCode, label):
- # print(ID.get(), password.get(), inputVerify.get(), verifyCode.get(), label.get())
-
- # 查找账户是否存在
- data = findID(ID.get())
-
- # 防止账户密码输入特殊字符空格' '
- import re
- IDdata = re.findall(r'\W', ID.get())
- passwordData = re.findall(r'\W', password.get())
- if ' ' in IDdata:
- label.set('账户名不能使用空格')
- ID.set('')
- elif ' ' in passwordData:
- label.set('密码不能使用空格')
- password.set('')
-
- # 防止输入内容为空''
- elif not ID.get():
- label.set('账户名不能为空')
- elif not password.get():
- label.set('密码不能为空')
-
- # 校对账户
- elif not data:
- # 校对验证码
- import re
- if re.findall(verifyCode.get(), inputVerify.get(), re.I):
- # 保存到列表中
- userData.append(f'{ID.get()} {password.get()}')
-
- label.set('账户注册成功')
- # 初始化输入框
- ID.set('')
- password.set('')
- inputVerify.set('')
-
- # 更新文件数据
- from 小功能包.文件操作 import WriteFileData
- WriteFileData.writelinesData(userDataPath, userData)
-
- # 验证码输入错误
- else:
- label.set('验证码输入错误')
- inputVerify.set('')
-
- # 账户输入错误
- else:
- label.set('该账户名已注册')
- ID.set('')
-
- getVerifyCode(verifyCode) # 更新验证码
-
-
- # 全局变量
- userDataPath = '.\\..\\user data\\data.txt'
- userData = []
-
-
- # 主函数
- def main():
- import tkinter as tk
- base = tk.Tk() # 新建窗口
- base.title('账户密码登录') # 标题
-
- # 全局变量
- labelData = tk.StringVar() # 标签数据
- ID = tk.StringVar() # 账号数据
- password = tk.StringVar() # 密码数据
- inputVerifyCode = tk.StringVar() # 输入验证码数据
- verifyCode = tk.StringVar() # 验证码
-
- # 初始化设置
- verifyCode.set(getVerifyCode(verifyCode)) # 初始验证码
- labelData.set('欢迎来到【周华2022博客】客户端')
-
- # 标签提示语
- textLabel = tk.Label(base, textvariable=labelData, height=2) # 文本标签
- textLabel.pack()
-
- # 账号 ----------------------------------------------------------------------------
- IDframe = tk.Frame(base, pady=8) # 账号框架
- IDframe.pack()
- # 账号标签
- IDlabel = tk.Label(IDframe, text='账户')
- IDlabel.pack(side=tk.LEFT)
- # 账号文本框
- IDentry = tk.Entry(IDframe, text=ID, highlightthickness=1)
- IDentry.pack(side=tk.RIGHT)
-
- # 密码 -----------------------------------------------------------------------------
- passwordFrame = tk.Frame(base, pady=8) # 密码框架
- passwordFrame.pack()
- # 密码标签
- passwordLabel = tk.Label(passwordFrame, text='密码')
- passwordLabel.pack(side=tk.LEFT)
- # 密码文本框
- passwordEntry = tk.Entry(passwordFrame, text=password, highlightthickness=1, show='*')
- passwordEntry.pack(side=tk.RIGHT)
-
- # 验证码 -----------------------------------------------------------------------------
- verifyFrame = tk.Frame(base, pady=6) # 验证码框架
- verifyFrame.pack()
- # 验证码标签
- verifyLabel = tk.Label(verifyFrame, text='验证码')
- verifyLabel.pack(side=tk.LEFT)
- # 验证码文本框
- verifyEntry = tk.Entry(verifyFrame, text=inputVerifyCode, highlightthickness=1, width=9)
- verifyEntry.pack(side=tk.LEFT)
- # 验证码更新1
- image = tk.PhotoImage(file='.\\..\\photo\\刷新.png')
- updataButton = tk.Button(verifyFrame, textvariable=verifyCode, relief=tk.FLAT)
- updataButton.config(image=image, width=20, height=20)
- updataButton.config(command=lambda: getVerifyCode(verifyCode))
- updataButton.pack(side=tk.LEFT)
- # 验证码更新2
- verifyUpdata = tk.Button(verifyFrame, textvariable=verifyCode, relief=tk.FLAT)
- verifyUpdata.config(command=lambda: getVerifyCode(verifyCode), width=7)
- verifyUpdata.pack()
-
- # 按钮 ------------------------------------------------------------------------------
- buttonFrame = tk.Frame(base, padx=60, pady=10) # 按钮框架
- buttonFrame.pack()
- # 账号登录按钮
- enterButton = tk.Button(buttonFrame, text='登录')
- enterButton.config(command=lambda: IDenter(ID, password, inputVerifyCode, verifyCode, labelData))
- enterButton.pack(side=tk.LEFT)
- # 空白标签(隔开按钮)
- blankLabel = tk.Label(buttonFrame, width=6)
- blankLabel.pack(side=tk.LEFT)
- # 账号注册按钮
- registerButton = tk.Button(buttonFrame, text='注册')
- registerButton.config(command=lambda: IDregister(ID, password, inputVerifyCode, verifyCode, labelData))
- registerButton.pack()
-
- base.mainloop() # 循环运行窗口
-
-
- # 代码测试
- if __name__ == '__main__':
- main()
-

- """
- 文件操作模块
- """
-
-
- # 通配符'*'变量定义
- __all__ = ['main']
-
-
- # 获取绝对路径 ------------------------------------------------------------------------
- __all__.append('getAbsPath') # 通配符'*'添加元素
- def getAbsPath(path):
- import os, sys
- return os.path.abspath(sys.path[0]+path)
-
-
- # 新建目录文件 ------------------------------------------------------------------------
- __all__.append('makeDirFile') # 通配符'*'添加元素
- def makeDirFile(path):
-
- # 路径分割
- dirPath = ''
- for i in path.split('\\')[:-1:]:
- dirPath += i + '\\'
-
- makeDir(dirPath) # 新建目录
- makeFile(path) # 新建文件
-
-
- # 新建目录 -----------------------------------------------------------------------------
- __all__.append('makeDir') # 通配符'*'添加元素
- def makeDir(path):
- path = getAbsPath(path) # 获取绝对路径
-
- # 判断文件是否存在,否则新建目录
- import os
- if not os.path.exists(path):
- os.mkdir(path)
-
-
- # 新建文件 -----------------------------------------------------------------------------
- __all__.append('makeFile') # 通配符'*'添加元素
- def makeFile(path):
- path = getAbsPath(path) # 获取绝对路径
-
- # 判断文件是否存在,否则新建文件
- import os
- if not os.path.exists(path):
- file = open(file=path, mode='w')
- file.close()
-
-
- # 读取文件数据 =========================================================================
- __all__.append('ReadFileData') # 通配符'*'添加元素
- class ReadFileData:
- # 构造方法
- def __init__(self):
- pass
-
- # 读取文件行数据,返回读取的数据 --------------------------------------------------------
- @classmethod
- def readlinesData(cls, path, container):
- data = container
- if container == list(): # 变量赋值
- data = []
-
- path = getAbsPath(path) # 获取绝对路径
-
- # 判断文件是否存在
- import os
- if not os.path.exists(path):
- return '文件不存在'
-
- # 读取文件数据
- with open(path, encoding='utf-8') as file:
- for i in file:
- if container == str(): # 字符串容器
- data += i
- elif container == list(): # 列表容器
- data.append(i)
- else:
- print('存储读取数据类型必须为字符串str()或者列表list()')
-
- return data
-
- # 读取文件行数据,返回读取的数据 --------------------------------------------------------
- @classmethod
- def readSplitData(cls, path, split, container):
- if container == list():
- data = []
- elif container == dict():
- data = dict()
-
- path = getAbsPath(path) # 获取绝对路径
-
- # 判断文件是否存在
- import os
- if not os.path.exists(path):
- return '文件不存在'
-
- # 读取文件数据
- with open(path, encoding='utf-8') as file:
- for i in file:
- if container == list():
- data.append(i.split(split))
- elif container == dict():
- data[i.split(split)[0]] = i.split(split)[1::]
- else:
- print('存储读取数据类型必须列表list()或者字典dict()')
-
- return data
-
-
- # 写入文件数据 =========================================================================
- __all__.append('WriteFileData') # 通配符'*'添加元素
- class WriteFileData:
- # 构造方法
- def __init__(self):
- pass
-
- # 写入文件行数据 --------------------------------------------------------------------
- @classmethod
- def writelinesData(cls, path, data):
- makeDirFile(path) # 新建目录和文件
- path = getAbsPath(path) # 获取绝对路径
-
- # 写入文件数据
- with open(path, 'w', encoding='utf-8') as file:
- if type(data) == str:
- file.write(data)
- if data[-1] != '\n':
- file.write('\n')
- elif type(data) == list:
- for i in data:
- file.write(i)
- if i[-1] != '\n' and i == data[-1]:
- file.write('\n')
- else:
- print('写入数据类型必须为字符串str()或者列表list()')
-
- # 写入文件行数据 --------------------------------------------------------------------
- @classmethod
- def writeSplitData(cls, path, data, split):
- makeDirFile(path) # 新建目录和文件
- path = getAbsPath(path) # 获取绝对路径
-
- # 写入文件数据
- with open(path, 'w', encoding='utf-8') as file:
- if type(data) == list:
- for i in data:
- for j in i:
- file.write(j)
- if i[-1] != j:
- file.write(split)
- if j[-1] != '\n' and i[-1] == j:
- file.write('\n')
-
- elif type(data) == dict:
- for i, j in data.items():
- file.write(i)
- for k in j:
- file.write(split + k)
- if k == j[-1] and k[-1] != '\n':
- file.write('\n')
-
- else:
- print('写入数据类型必须为列表list()或者字典dict()')
-
-
- # 主函数 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- def main():
- print(ReadFileData.readlinesData('.\\..\\十六进制颜色码.txt', ''))
- print(ReadFileData.readSplitData('.\\..\\十六进制颜色码.txt', '、', dict()))
- data = ReadFileData.readlinesData('.\\..\\十六进制颜色码.txt', '')
- WriteFileData.writelinesData('.\\..\\123\\456.txt', data)
- data2 = ReadFileData.readSplitData('.\\..\\十六进制颜色码.txt', '、', dict())
- WriteFileData.writeSplitData('.\\..\\456\\789.txt', data2, '(*)')
-
-
- # 代码测试
- if __name__ == '__main__':
- main()
- else:
- print(f'导入"{__name__}"模块')
-
- """
- 获取验证码模块
- """
-
-
- # 定义此属性是为了方便使用通配符‘*’
- __all__ = ['main']
-
-
- # 获取验证码 ===================================================================
- __all__.append('verify_code') # 通配符'*'添加元素
- class verify_code:
- __int_list = [] # 用于存储数字
- __str_list = [] # 用于存储字母
- __all_list = [] # 用于存储数字和字母
-
- # 列表添加元素 --------------------------------------------------------------
- @classmethod
- def __list_append(cls):
- # 初始化清空
- cls.__int_list = []
- cls.__str_list = []
- cls.__all_list = []
-
- # 获取0-9数字
- for i in range(10):
- cls.__int_list.append(str(i))
-
- # 获取26个大小写字母
- for i in range(26):
- cls.__str_list.append(chr(ord('a')+i))
- cls.__str_list.append(chr(ord('A')+i))
-
- # 把数字和字母列表集合到一起
- for i in range(5):
- cls.__all_list.extend(cls.__int_list)
-
- cls.__all_list.extend(cls.__str_list)
-
- # 获取列表元素 --------------------------------------------------------------
- @classmethod
- def get_list_element(cls, list, int):
- import random
- code = ''
- for i in range(int):
- code += random.choice(list)
-
- return code
-
- # 纯获取数字验证码 -------------------------------------------------------------
- @classmethod
- def int_sequence(cls, int=6):
- cls.__list_append() # 列表添加元素
-
- # 获取列表的元素
- return cls.get_list_element(cls.__int_list, int)
-
- # 获取纯字母验证码 -------------------------------------------------------------
- @classmethod
- def str_sequence(cls, int=6):
- cls.__list_append() # 列表添加元素
-
- # 获取列表的元素
- return cls.get_list_element(cls.__str_list, int)
-
- # 获取数字和字母验证码 --------------------------------------------------------
- @classmethod
- def verify_code(cls, int=6):
- cls.__list_append() # 列表添加元素
-
- # 获取列表的元素
- return cls.get_list_element(cls.__all_list, int)
-
-
- # 主函数 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- def main():
- print(verify_code.int_sequence())
- print(verify_code.str_sequence())
- print(verify_code.verify_code())
-
-
- # 代码测试 ==========================================================================
- if __name__ == '__main__':
- main()
-
- else:
- print(f'导入"{__name__}"模块')
-
-

作者:周华
创作日期:2023/10/26