python 隨機(jī)密碼生成器的實(shí)現(xiàn)示例
最近在研究PySimpleGUI庫,把之前寫的一個(gè)隨機(jī)密碼生成器改成GUI版本發(fā)出來,有興趣的兄弟們可以拿走。
因?yàn)槟芰τ邢?,目前只能寫生成一個(gè)隨機(jī)密碼的Gui版本,等我學(xué)了更多的內(nèi)容再慢慢完善。
核心代碼很簡(jiǎn)單,界面也很粗陋。
如果你能寫得更好,不要噴,直接回帖發(fā)出來讓我參考下,謝謝。
代碼:
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 #數(shù)字
if biaodian: words += string.punctuation #標(biāo)點(diǎn)
#規(guī)避樣本數(shù)量 < 密碼長(zhǎng)度的問題
if len(words) <= pwd_len: words = words * (pwd_len // len(words) + 1)
zhui_len = len(f'{qianzhui}{houzhui}')
if pwd_len < zhui_len:
return '密碼長(zhǎng)度<前后綴的長(zhǎng)度之和!'.split() * 3
for _ in range(pwd_count):
chosen = ''.join(random.sample(words, pwd_len)) #生產(chǎn)隨機(jī)列表
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') # 設(shè)置當(dāng)前主題
xuan_frame = [
sg.Checkbox(
'小寫a-z',
default=True,
key='小寫',
),
sg.Checkbox(
'大寫A-Z',
default=True,
key='大寫',
),
sg.Checkbox(
'數(shù)字0-9',
default=True,
key='數(shù)字',
),
sg.Checkbox(
'標(biāo)點(diǎn)',
default=True,
key='標(biāo)點(diǎn)',
),
],
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('密碼長(zhǎng)度'),
sg.Slider(
range=(5, 55),
default_value=6,
orientation='horizontal', #滑塊方向
tick_interval=10, #顯示的步長(zhǎng)
enable_events=True,
key='長(zhǎng)度',
size=(41, 20))
],
shu_frame = [
sg.Text('密碼個(gè)數(shù)'),
sg.Slider(
range=(5, 55),
default_value=5,
orientation='horizontal', #滑塊方向
tick_interval=10, #顯示的步長(zhǎng)
enable_events=True,
key='個(gè)數(shù)',
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='結(jié)果',
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(
'復(fù)制所有密碼',
key='復(fù)制所有密碼',
button_color='#118890',
enable_events=True,
),
],
[
sg.Text(
'取消或勾選密碼類型后,要拖動(dòng)滑塊,才能重新生成',
text_color='#0000ff',
key='提示',
font=('宋體', 10),
justification='center',
)
]]
# 創(chuàng)建展示窗口8
window = sg.Window('隨機(jī)密碼.220921 - [url=mailto:wkdxz@52pojie.cn]wkdxz@52pojie.cn[/url] ',
layout,
font=('微軟雅黑', 10),
size=(400, 610),
element_justification='center')
# 事件循環(huán)并獲取輸入值
while True:
event, values = window.read()
if not event:
break
elif event != '復(fù)制所有密碼': #任何事件都會(huì)生成密碼
pwds = get_passwords(values['小寫'], values['大寫'], values['數(shù)字'],
values['標(biāo)點(diǎn)'], values['自定義'], values['前綴'],
values['后綴'], values['排除'], int(values['長(zhǎng)度']),
int(values['個(gè)數(shù)']))
# print(event, values)
if event in ['個(gè)數(shù)', '長(zhǎng)度']:
window['結(jié)果'].update(pwds)
window['提示'].update('點(diǎn)擊單條密碼,可復(fù)制到剪貼板')
if event == '結(jié)果':
try:
pwd = values['結(jié)果'][0].split('.', 1)[1].strip()
copy(pwd)
window['提示'].update(f'已復(fù)制:\n{pwd}')
except:
window['提示'].update('取消或勾選密碼類型后,要拖動(dòng)滑塊,才能重新生成')
if event == '清空':
window['長(zhǎng)度'].update(0)
window['個(gè)數(shù)'].update(0)
window['結(jié)果'].update('')
window['提示'].update('')
window['自定義'].update('')
window['前綴'].update('')
window['后綴'].update('')
window['排除'].update('')
if event == '復(fù)制所有密碼':
try:
passwords = [i.split('.', 1)[1].strip() for i in pwds]
copy('\n'.join(passwords))
window['提示'].update(f'【所有】密碼({len(pwds)}條)已復(fù)制到剪貼板')
except:
window['提示'].update('取消或勾選密碼類型后,要拖動(dòng)滑塊,才能重新生成')
window.close()
if __name__ == '__main__':
gui()
到此這篇關(guān)于python 隨機(jī)密碼生成器的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)python 隨機(jī)密碼生成器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python運(yùn)算符之賦值運(yùn)算符的使用技巧詳解
這篇文章主要為大家詳細(xì)介紹了ython賦值運(yùn)算符(等等減等加等)的核心概念,應(yīng)用場(chǎng)景以及實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2026-05-05
Python實(shí)現(xiàn)批量將CSV按行或按列拆分
這篇文章主要介紹了一個(gè)基于Python標(biāo)準(zhǔn)庫csv和PyQt5的高性能CSV拆分工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2026-03-03
Python中動(dòng)態(tài)檢測(cè)編碼chardet的使用教程
最近利用python抓取一些網(wǎng)上的數(shù)據(jù),遇到了編碼的問題。非常頭痛,幸運(yùn)的是找到了解決的方法,下面這篇文章主要跟大家介紹了關(guān)于Python中動(dòng)態(tài)檢測(cè)編碼chardet的使用方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-07-07
Python基于codecs模塊實(shí)現(xiàn)文件讀寫案例解析
這篇文章主要介紹了Python基于codecs實(shí)現(xiàn)文件讀寫案例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
python+Splinter實(shí)現(xiàn)12306搶票功能
這篇文章主要為大家詳細(xì)介紹了python+Splinter實(shí)現(xiàn)12306搶票功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09
python的scipy實(shí)現(xiàn)插值的示例代碼
這篇文章主要介紹了python的scipy實(shí)現(xiàn)插值的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11

