序言
对于你喜欢的事想去做的事,你必须付出百分之一千的努力,你知道这一路可能会有很多困难,会有坚持不下去想要放弃的时候,也有时候,你不一定会得到你想要的结果,但你一定要相信,就算再贫瘠的土地你日日灌溉,总有那么一天会长出花草来的,所以你一定要坚持。
乾坤未定,你我皆是黑马。
-实战
本篇是对tkinter知识点的巩固及练习,整体需要大家在操作的时候;稍作修改;因为我把我每一步怎么做的步骤以及思路都给写上了,所以需要大家在练习的时候,仔细斟酌。
思路步骤:
1、在桌面创建长时间停留的窗口
2、在窗口中绘制相关组件进行布局排版的调整
3、根据相关业务需求进行调整及实现具体功能
第一步:搭建窗口布局
from tkinter import *
tk = Tk()
cv = Canvas(tk, width=200, height=30)
tk.title("逻辑-Tony密码选择器")
# 窗口组件的位置
tk.geometry('+500+200')
cv.pack()
tk.mainloop()
image
第二步: 绘制相关组件进行布局排版
市面上流行的三种布局
image
这里采用的是网格布局
f1 = Frame(tk)
f1.pack(padx=20, pady=15)
# 设置标签
Label(f1, text="密码长度:").grid(row=0, column=0)
f1r = Frame(f1)
f1r.grid(row=0, column=1)
# 0 行 1 列
Entry(f1r, width=5).grid(row=0, column=1)
Button(f1r, text='+').grid(row=0, column=3)
Button(f1r, text='-').grid(row=0, column=4)
image
经过 网格布局 的排版,已经初见效果;界面看起来整洁了很多,Nice 接下来......
Label(f1, text="密码强度:").grid(row=1, column=0)
level = IntVar()
level.set(3)
f1rb = Frame(f1)
f1rb.grid(row=1, column=1)
Radiobutton(f1rb, text='简单', variable=level).grid(row=1, column=1)
Radiobutton(f1rb, text='一般', variable=level).grid(row=1, column=2)
Entry(tk, state='readonly').pack()
Button(tk, text='生成密码并复制到剪切板').pack()
密码这一块我设置了只允许可读而不可修改;这样就杜绝了某些错误异常判断的操作。
image
到目前位置,我们的界面布局已经大致完工了;接下来主要是实现各个组件相关的业务功能
第三步: 业务逻辑处理及功能的实现
加减操作我这里做了一个条件处理,只有在数据大于4的时候才能递减。
# 加号
def plus():
leng.set(int(leng.get()) + 1)
# 减号
def subtract():
lengVal = int(leng.get())
# 判断条件
if lengVal > 4:
leng.set(lengVal - 1)
leng = StringVar()
leng.set(6)
Entry(f1r, width=5,textvariable=leng, state='readonly').grid(row=0, column=1)
Button(f1r, text='+', command=plus).grid(row=0, column=3)
Button(f1r, text='-', command=subtract).grid(row=0, column=4)
image
image
import string
# 获取密码
def getPassword():
# 数字
str1 = string.digits
# 小写字母
str2 = string.ascii_lowercase
str3 = string.ascii_uppercase
str4 = string.punctuation
# 简单 -
dicts = {
1: [str1],
3: [str1, str2, str3],
4: [str1, str2, str3, str4]
}
# 设置到 输入框中
pw.set(str1)
Radiobutton(f1rb, text='简单', variable=level,value=1).grid(row=1, column=1)
Radiobutton(f1rb, text='一般', variable=level,value=3).grid(row=1, column=2)
Radiobutton(f1rb, text='复杂', variable=level,value=4).grid(row=1, column=3)
pw = StringVar()
Entry(tk,textvariable=pw,state='readonly').pack()
Button(tk, text='生成密码并复制到剪切板', command=getPassword).pack()
image
经过我们的修改,已经能够成功返回获取的数据了,至此已经成功了一大半! 接下来让我们对程序进程再一次的修改; 通过将密码以及密码等级进行传递。
# 获取密码 传递密码等级
def getPassword(leng, level):
arr = cutlength(leng, level)
# 数字
str1 = string.digits
# 小写字母
str2 = string.ascii_lowercase
str3 = string.ascii_uppercase
str4 = string.punctuation
# 简单 -
dicts = {
1: [str1],
3: [str1, str2, str3],
4: [str1, str2, str3, str4]
}
# print(dicts)
return makePassword(dicts[level], arr)
这里采用了分层;分别对要进行处理的密码等级进行划分;
这样会使程序看起来能够更加的简洁、干净,方便大家的阅读。
最重要的是 ---> 还能提高代码质量 🤣
# 根据密码等级 剪出数组
def cutlength(leng, level):
res = []
for item in range(level, 1, -1):
res.append(random.randint(1, leng - sum(res) - item + 1))
res.append(leng - sum(res))
random.shuffle(res)
return res
这里已经能够获取到密码了,但是密码还是有一些规律可循,包括密码生成的时候;会按照固有的数据输出方式进行排版;这样显然是达不到我们的需求的,与此同时......干脆咱们在来一个 大洗牌 吧!😁
# 根据提供的字典 制造密码数组
def makePassword(dicts, arr):
res = []
for i in range(len(arr)):
for j in range(arr[i]):
res += random.choice(dicts[i])
print(res)
random.shuffle(res)
print(res)
考虑到点击按钮能够直接生成相关密码的同时还能够直接复制下来进行粘贴,这里我用到了另一个模块 clipboard
import clipboard
# 获取密码 至 剪贴板
def getPw():
res = getPassword(int(leng.get()), level.get())
# 剪切板
clipboard.copy(res)
# 设置到 输入框中
pw.set(res)
最终成果的演示
简单等级强度
image
一般等级强度
image
复杂等级强度
image
在这个浮躁的时代;竟然还有人能坚持篇篇原创;
如果本文对你学习有所帮助-可以点赞👍+ 关注!将持续更新更多新的文章。
支持原创。感谢!