python 随机密码生成器

news2024/11/25 21:52:08

最近在研究PySimpleGUI库,把之前写的一个随机密码生成器改成GUI版本发出来,有兴趣的兄弟们可以拿走。
因为能力有限,目前只能写生成一个随机密码的Gui版本,等我学了更多的内容再慢慢完善。
核心代码很简单,界面也很粗陋。
如果你能写得更好,不要喷,直接回帖发出来让我参考下,谢谢。

代码:

from pyperclip import copy
import PySimpleGUI as sg
import random
import string
 
 
def get_passwords(xiaoxie=True,
                  daxie=True,
                  shuzi=True,
                  biaodian=True,
                  zidingyi='',
                  qianzhui='',
                  houzhui='',
                  paichu='',
                  pwd_len=11,
                  pwd_count=1):
    pwd_list = []
    if not any([xiaoxie, daxie, shuzi, biaodian]): return '至少要勾选一种密码类型!'
    words = zidingyi
    if xiaoxie: words += string.ascii_lowercase  #小写字母
    if daxie: words += string.ascii_uppercase  #大写字母
    if shuzi: words += string.digits  #数字
    if biaodian: words += string.punctuation  #标点
    #规避样本数量 < 密码长度的问题
    if len(words) <= pwd_len: words = words * (pwd_len // len(words) + 1)
 
    zhui_len = len(f'{qianzhui}{houzhui}')
    if pwd_len < zhui_len:
        return '密码长度<前后缀的长度之和!'.split() * 3
    for _ in range(pwd_count):
        chosen = ''.join(random.sample(words, pwd_len))  #生产随机列表
 
        chosen = f'{qianzhui}{chosen}{houzhui}'  #加前后缀
 
        if set(paichu):  #排除字符
            for i in set(paichu):
                chosen = chosen.replace(i, '')
 
        pwd_list.append(chosen.strip())  # 组成字符串
    return [
        f'{str(n).zfill(len(str(pwd_count)))}. {i}'
        for n, i in enumerate(pwd_list, 1)
    ]
 
 
def gui():  # sourcery skip: do-not-use-bare-except
    sg.theme('GrayGrayGray')  # 设置当前主题
    xuan_frame = [
        sg.Checkbox(
            '小写a-z',
            default=True,
            key='小写',
        ),
        sg.Checkbox(
            '大写A-Z',
            default=True,
            key='大写',
        ),
        sg.Checkbox(
            '数字0-9',
            default=True,
            key='数字',
        ),
        sg.Checkbox(
            '标点',
            default=True,
            key='标点',
        ),
    ],
 
    zidingyi_frame = [
        sg.Text('自定义字:'),
        sg.InputText(
            key='自定义',
            size=(10, 11),
        ),
        sg.Text(' 前缀:'),
        sg.InputText(
            key='前缀',
            size=(5, 11),
        ),
        sg.Text(' 后缀:'),
        sg.InputText(
            key='后缀',
            size=(5, 11),
        ),
    ],
 
    paichu_frame = [
        sg.Text('排除字符:'),
        sg.InputText(
            key='排除',
            size=(40, 11),
        ),
    ],
    chang_frame = [
        sg.Text('密码长度'),
        sg.Slider(
            range=(5, 55),
            default_value=6,
            orientation='horizontal',  #滑块方向
            tick_interval=10,  #显示的步长
            enable_events=True,
            key='长度',
            size=(41, 20))
    ],
    shu_frame = [
        sg.Text('密码个数'),
        sg.Slider(
            range=(5, 55),
            default_value=5,
            orientation='horizontal',  #滑块方向
            tick_interval=10,  #显示的步长
            enable_events=True,
            key='个数',
            size=(41, 20))
    ],
 
    layout = [[
        sg.Frame(
            '',
            xuan_frame,
            size=(400, 40),
            pad=(5),
        ),
    ], [
        sg.Frame(
            '',
            zidingyi_frame,
            size=(400, 40),
            pad=(5),
        ),
    ], [sg.Frame(
        '',
        paichu_frame,
        size=(400, 40),
        pad=(5),
    )], [sg.Frame(
        '',
        chang_frame,
        size=(400, 80),
        pad=(5),
    )], [sg.Frame(
        '',
        shu_frame,
        size=(400, 80),
        pad=(5),
    )],
              [
                  sg.Listbox([],
                             key='结果',
                             size=(57, 10),
                             horizontal_scroll=True,
                             highlight_background_color='gray',
                             font=('宋体', 10),
                             enable_events=True,
                             pad=(5, 10))
              ],
              [
                  sg.Button('清空', key='清空', pad=(10, 10), enable_events=True),
                  sg.Button(
                      '复制所有密码',
                      key='复制所有密码',
                      button_color='#118890',
                      enable_events=True,
                  ),
              ],
              [
                  sg.Text(
                      '取消或勾选密码类型后,要拖动滑块,才能重新生成',
                      text_color='#0000ff',
                      key='提示',
                      font=('宋体', 10),
                      justification='center',
                  )
              ]]
 
    # 创建展示窗口8
    window = sg.Window('随机密码.220921 - [url=mailto:wkdxz@52pojie.cn]wkdxz@52pojie.cn[/url]   ',
                       layout,
                       font=('微软雅黑', 10),
                       size=(400, 610),
                       element_justification='center')
 
    # 事件循环并获取输入值
    while True:
        event, values = window.read()
        if not event:
            break
        elif event != '复制所有密码':  #任何事件都会生成密码
            pwds = get_passwords(values['小写'], values['大写'], values['数字'],
                                 values['标点'], values['自定义'], values['前缀'],
                                 values['后缀'], values['排除'], int(values['长度']),
                                 int(values['个数']))
        # print(event, values)
        if event in ['个数', '长度']:
            window['结果'].update(pwds)
            window['提示'].update('点击单条密码,可复制到剪贴板')
 
        if event == '结果':
            try:
                pwd = values['结果'][0].split('.', 1)[1].strip()
                copy(pwd)
                window['提示'].update(f'已复制:\n{pwd}')
            except:
                window['提示'].update('取消或勾选密码类型后,要拖动滑块,才能重新生成')
 
        if event == '清空':
            window['长度'].update(0)
            window['个数'].update(0)
            window['结果'].update('')
            window['提示'].update('')
            window['自定义'].update('')
            window['前缀'].update('')
            window['后缀'].update('')
            window['排除'].update('')
 
        if event == '复制所有密码':
            try:
                passwords = [i.split('.', 1)[1].strip() for i in pwds]
                copy('\n'.join(passwords))
                window['提示'].update(f'【所有】密码({len(pwds)}条)已复制到剪贴板')
            except:
                window['提示'].update('取消或勾选密码类型后,要拖动滑块,才能重新生成')
    window.close()
 
 
if __name__ == '__main__':
    gui()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1208377.html

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

相关文章

C语言从入门到精通之【字符串】

C语言没有专门用于储存字符串的变量类型&#xff0c;字符串都被储存在char类型的数组中。数组由连续的存储单元组成&#xff0c;字符串中的字符被储存在相邻的存储单元中&#xff0c;每个单元储存一个字符&#xff0c;每个字符占1个字节。 数组末尾位置的字符\0。这是空字符&am…

[Kettle] 记录处理

1.排序记录 排序是对数据中的无序记录&#xff0c;按照自然或客观规律&#xff0c;根据关键字段大小递增或递减的次序&#xff0c;对记录重新排列的过程 数据源 2019年11月月考数学成绩(Kettle数据集3).xlshttps://download.csdn.net/download/Hudas/88521681 2019年11月月考…

【10套模拟】【4】

关键字&#xff1a; 二分查找比较次数、*广义表头尾链表存储、森林转二叉树、链地址法哈希表、交换所有子树、创建二叉排序树

【10套模拟】【3】

关键字&#xff1a; 物理存储、完全二叉树、出栈入栈时间复杂度、线索二叉树

【云上探索实验室】快速入门AI 编程助手 Amazon CodeWhisperer ——码上学堂领学员招募

目录 一、Amazon CodeWhisperer1.1、大语言模型与AI编程1.2、CodeWhisperer初体验 二、云上探索实验室-码上学堂2.1、码上学堂2.2、学课通道入口 三、领学员招募3.1、报名方式3.2、领学奖励 一、Amazon CodeWhisperer 1.1、大语言模型与AI编程 大语言模型&#xff08;Large L…

如何理解 Linux 当中 “一切皆文件“

我们在 操作系统 当中的所有操作&#xff0c;包括对文件的所有操作&#xff0c;最终其实都是 通过 进程来实现的。 我们想象我们实现的各种C/C 程序&#xff0c;或者是各种语言实现的程序&#xff0c;本质上都是要 编译形成 可执行文件&#xff0c;然后操作系统把这个可执行文…

设备数据如何为预测性维护提供支持

预测性维护是现代制造业中一种高效而受欢迎的维护策略&#xff0c;它能够帮助企业提前发现设备故障的早期迹象&#xff0c;并采取相应措施&#xff0c;从而避免生产线的停机和生产效率的下降。实施预测性维护的关键在于充分利用设备数据&#xff0c;通过数据的收集、处理和分析…

浏览器Cookie是什么?如何在MaskFog指纹浏览器中导入Cookie?

在使用互联网时我们常常听到cookie这个词&#xff0c;那到底什么是cookie呢&#xff1f; Cookie是某些网站为了辨别用户身份而储存在用户本地终端上的数据&#xff08;通常经过加密&#xff09;&#xff0c;由用户客户端计算机暂时或永久保存的信息客户端向服务器发起请求&…

C语言从入门到精通之【char类型】

char类型用于储存字符&#xff08;如&#xff0c;字母或标点符号&#xff09;&#xff0c;但是从技术层面看&#xff0c;char是整数类型。因为char类型实际上储存的是整数而不是字符。计算机使用数字编码来处理字符&#xff0c;即用特定的整数表示特定的字符。 char类型占1个字…

循环服务器

一、服务器模型 在网络程序里面,通常都是一个服务器处理多 个客户机。为了处理多个客户机的请求, 服务器端的程序有不同的处理方式。 1、循环服务器模型 socket()&#xff1b; bind(); liste(); while(1) { accept(); while(1) { recv ret0; break; } close(acceptfd); } close…

《使用EasyExcel在Excel中增加序号列的方法》

《使用EasyExcel在Excel中增加序号列的方法》 1、简介2、正文3、核心代码4、使用方法5、效果 1、简介 在处理Excel文件时&#xff0c;有时候需要为表格增加序号列。本文介绍了如何使用Java代码实现在Excel中增加序号列的功能&#xff0c;并提供了一个示例代码。 2、正文 在处理…

2023.11.14-hive的类SQL表操作之,4个by区别

目录 1.表操作之4个by,分别是 2.Order by:全局排序 3.Cluster by 4.Distribute by :分区 5. Sort by :每个Reduce内部排序 6.操作练习 步骤一.创建表 步骤二.加载数据 步骤三.验证数据 1.表操作之4个by,分别是 order by 排序字段名 cluster by 分桶并排序字段名 dis…

异常与中断(一)

使用生活实例引入中断 假设有个大房间里面有小房间&#xff0c;婴儿正在睡觉&#xff0c;他的妈妈在外面看书。 问&#xff1a;这个母亲怎么才能知道这个小孩醒&#xff1f; 过一会打开一次房门&#xff0c;看婴儿是否睡醒&#xff0c;然后接着看书一直等到婴儿发出声音以后再…

SQL之回炉重造

重新学sql&#xff0c;整个知识框架出来&#xff0c;之前学的太烂了 SQL是什么&#xff1a; SQL 是一种操作数据库的语言&#xff0c;包括创建数据库、删除数据库、查询记录、修改记录、添加字段等。SQL 虽然是一种被 ANSI 标准化的语言&#xff0c;但是它有很多不同的实现版…

医疗行业创新:低代码工具推动业务自动化和智能化

随着科技的不断发展&#xff0c;数字化已经成为各个领域的必然趋势。同样&#xff0c;在医疗领域&#xff0c;数字化转型也已经成为必要性。 早在新冠疫情之前很多国家和地区就已经开始尝试医疗数字化的转型。有很多人认为&#xff0c;医疗数字化在未来不是锦上添花&#xff0…

黑客泄露 3500 万条 LinkedIn 用户记录

被抓取的 LinkedIn 数据库分为两部分泄露&#xff1a;一部分包含 500 万条用户记录&#xff0c;第二部分包含 3500 万条记录。 LinkedIn 数据库保存了超过 3500 万用户的个人信息&#xff0c;被化名 USDoD 的黑客泄露。 该数据库在臭名昭著的网络犯罪和黑客平台 Breach Forum…

langchain实战-hello world

一、LangChain简介 github地址&#xff1a; GitHub - langchain-ai/langchain: ⚡ Building applications with LLMs through composability ⚡ LangChain是一个用于开发由语言模型支持的应用程序的框架。它使应用程序能够&#xff1a; 具有上下文感知能力&#xff1a;将语言模…

【左程云算法全讲7】二叉树基础算法及递归套路

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于左程云算法课程进行的&#xff0c;每个知识点的修正和深入主要参考…

【数据仓库】数仓分层方法详解与层次调用规范

文章目录 一. 数仓分层的意义1. 清晰数据结构。2. 减少重复开发3. 方便数据血缘追踪4. 把复杂问题简单化5. 屏蔽原始数据的异常6. 数据仓库的可维护性 二. 如何进行数仓分层&#xff1f;1. ODS层2. DW层2.1. DW层分类2.2. DWD层2.3. DWS 3. ADS层 4、层次调用规范 一. 数仓分层…

前端学习笔记--面试题系列总结

event loop它的执行顺序&#xff1a; 一开始整个脚本作为一个宏任务执行执行过程中同步代码直接执行&#xff0c;宏任务进入宏任务队列&#xff0c;微任务进入微任务队列当前宏任务执行完出队&#xff0c;检查微任务列表&#xff0c;有则依次执行&#xff0c;直到全部执行完执…