python tkinter实现密码生成工具【漂亮的GUI】【可选择主题】【兼容WindowsXP】

先贴张图:

 (本人的程序+它生成的999位密码)

这里用到了一个外部库:ttkbootstrap。

安装方法:

pip install ttkbootstrap

接下来是代码(懒得说了,本人打字太慢,等打完就年后了):

import random
import tkinter as tk
import ttkbootstrap as ttk

root = tk.Tk()
root.title("密码生成器")


# step0:func
def give_me_a_psw():
    psw_list = nums * 2
    psw_str = ''
    if is_using_abcs.get():
        psw_list += abcs * 50
    if is_using_ABCs.get():
        psw_list += ABCs * 50
    if is_using_SIMs.get():
        psw_list += SIMs * 15
    if is_using_F00.get():
        psw_list += F00
    if is_using_O000.get():
        psw_list += O000
    if is_using_ELSE.get():
        psw_list += ELSE
    for i in range(int(length.get()) - 1):
        psw_str += random.choice(psw_list)
    Psw.set(psw_str)
    info.config(text="刚刚生成了一个" + str(length.get()) + "位的密码。")


def init():
    root.attributes("-topmost", True)
    root.resizable(False, False)
    info.config(text="初始化成功,您可以使用本程序了。")


def copy():
    if Psw.get():
        root.clipboard_clear()
        root.clipboard_append(Psw.get())
        info.config(text="已经复制到剪贴板。")
    else:
        info.config(text="复制失败:请保证文本框内有内容。")


def change_theme():
    theme_cbo_value = theme_cbo.get()
    style.theme_use(theme_cbo_value)
    theme_selected.configure(text=theme_cbo_value)
    theme_cbo.selection_clear()
    info.config(text="已经切换为 " + theme_cbo_value + " 主题。")


def change_size():
    info.config(text="已经将密码位数重设为" + str(length.get()) + "位。")


# step1:vars
nums = [str(i) for i in range(1, 1000)]  # length
NUMs = [str(i) for i in range(10)]
abcs = [chr(i) for i in range(97, 123)]
ABCs = [chr(i) for i in range(65, 91)]
SIMs = [chr(i) for i in range(33, 48)] + [chr(i) for i in range(92, 97)] + ['|', '}', '~']
F00 = [chr(i) for i in range(161, 501)]
O000 = [chr(i) for i in range(500, 1001)]
ELSE = [chr(i) for i in range(1000, 10001)]
is_using_abcs = tk.BooleanVar()
is_using_abcs.set(True)
is_using_ABCs = tk.BooleanVar()
is_using_ABCs.set(True)
is_using_SIMs = tk.BooleanVar()
is_using_SIMs.set(False)
is_using_F00 = tk.BooleanVar()
is_using_F00.set(False)
is_using_O000 = tk.BooleanVar()
is_using_O000.set(False)
is_using_ELSE = tk.BooleanVar()
is_using_ELSE.set(False)
length_var = tk.IntVar()
length_var.set(8)
Psw = tk.StringVar()
Psw.set('')
# step2:get length
frame1 = tk.Frame(root)
label = ttk.Label(frame1, text='密码长度:')
length = ttk.Combobox(frame1, textvariable=length_var, values=nums,
                      state='readonly')
length.bind('<<ComboboxSelected>>', lambda event: change_size())
label.grid(row=0, column=0, pady=1, padx=2)
length.grid(row=0, column=1, pady=1, padx=2)
frame1.pack(fill=tk.BOTH, expand=tk.YES, padx=20, pady=5)
# sept3: options
frame2 = tk.Frame(root)
sf1 = tk.Frame(frame2)
sf2 = tk.Frame(frame2)
cb1 = ttk.Checkbutton(sf1, variable=is_using_abcs, text="使用小写字母")
cb1.grid(row=0, column=0, pady=1, padx=2)
cb2 = ttk.Checkbutton(sf1, variable=is_using_ABCs, text="使用大写字母")
cb2.grid(row=0, column=1, pady=1, padx=2)
cb3 = ttk.Checkbutton(sf1, variable=is_using_SIMs, text="使用符号")
cb3.grid(row=0, column=2, pady=1, padx=2)
cb4 = ttk.Checkbutton(sf2, variable=is_using_F00, text="使用ascii码为161-500的特殊符号(有风险)")
cb4.grid(row=0, column=0, pady=1, padx=2)
cb5 = ttk.Checkbutton(sf2, variable=is_using_O000, text="使用ascii码为500-1000的特殊符号(有风险)")
cb5.grid(row=1, column=0, pady=1, padx=2)
cb5 = ttk.Checkbutton(sf2, variable=is_using_ELSE, text="使用ascii码为1000-10000的特殊符号(极其有风险)")
cb5.grid(row=2, column=0, pady=1, padx=2)
sf1.pack()
sf2.pack()
frame2.pack(fill=tk.BOTH, expand=tk.YES, padx=20, pady=5)
# step4:entry and button
frame3 = tk.Frame(root)
entry = ttk.Entry(frame3, textvariable=Psw)
entry.grid(row=0, column=0, pady=1, padx=2)
button1 = tk.Button(frame3, text="一键生成密码", command=give_me_a_psw)
button1.grid(row=0, column=1, pady=1, padx=2)
button2 = tk.Button(frame3, text="复制到剪贴板", command=copy)
button2.grid(row=0, column=2, pady=1, padx=2)
frame3.pack(fill=tk.BOTH, expand=tk.YES, padx=20, pady=5)
# step5:theme
style = ttk.Style()
theme_names = style.theme_names()
theme_selection = ttk.Frame(root, padding=(10, 10, 10, 0))
theme_selection.pack(fill=tk.BOTH, expand=tk.YES, padx=20, pady=5)
lbl = ttk.Label(theme_selection, text="选择主题:")
theme_cbo = ttk.Combobox(state='readonly', master=theme_selection, values=theme_names)
theme_cbo.pack(padx=2, side=tk.RIGHT, pady=1)
theme_cbo.current(theme_names.index(style.theme.name))
lbl.pack(side=tk.RIGHT, pady=1, padx=2)
theme_cbo.bind('<<ComboboxSelected>>', lambda event: change_theme())
theme_selected = ttk.Label(master=theme_selection, text=theme_cbo.get(), font="-weight bold")
theme_selected.pack(side=tk.LEFT, pady=1, padx=2)
# step6:info bar
info = ttk.Label(root)
info.pack(fill=tk.BOTH, expand=True, padx=20, pady=5)
# step7:start!!!
if __name__ == '__main__':
    init()
    root.mainloop()

在python3.10上成功运行。

=============华丽的分割线==================

有一天我突然想,这个程序能不能在WindowsXP上运行,结果ttkbootstrap安装不了……于是我专门更改了代码,使它可以在WindowsXP上运行了。效果见截图:

第三方库:sv_ttk

pip install sv_ttk

 源代码:

import random
import tkinter as tk
import tkinter.ttk as ttk
import sv_ttk

root = tk.Tk()
root.title("密码生成器")


# step0:func
def give_me_a_psw():
    psw_list = nums * 2
    psw_str = ''
    if is_using_abcs.get():
        psw_list += abcs * 50
    if is_using_ABCs.get():
        psw_list += ABCs * 50
    if is_using_SIMs.get():
        psw_list += SIMs * 15
    if is_using_F00.get():
        psw_list += F00
    if is_using_O000.get():
        psw_list += O000
    if is_using_ELSE.get():
        psw_list += ELSE
    for i in range(int(length.get()) - 1):
        psw_str += random.choice(psw_list)
    Psw.set(psw_str)
    info.config(text="刚刚生成了一个" + str(length.get()) + "位的密码。")


def init():
    sv_ttk.set_theme("dark")
    root.attributes("-topmost", True)
    root.resizable(False, False)
    info.config(text="初始化成功,您可以使用本程序了。")


def copy():
    if Psw.get():
        root.clipboard_clear()
        root.clipboard_append(Psw.get())
        info.config(text="已经复制到剪贴板。")
    else:
        info.config(text="复制失败:请保证文本框内有内容。")

def change_size():
    info.config(text="已经将密码位数重设为" + str(length.get()) + "位。")


# step1:vars
nums = [str(i) for i in range(1, 1000)]  # length
NUMs = [str(i) for i in range(10)]
abcs = [chr(i) for i in range(97, 123)]
ABCs = [chr(i) for i in range(65, 91)]
SIMs = [chr(i) for i in range(33, 48)] + [chr(i) for i in range(92, 97)] + ['|', '}', '~']
F00 = [chr(i) for i in range(161, 501)]
O000 = [chr(i) for i in range(500, 1001)]
ELSE = [chr(i) for i in range(1000, 10001)]
is_using_abcs = tk.BooleanVar()
is_using_abcs.set(True)
is_using_ABCs = tk.BooleanVar()
is_using_ABCs.set(True)
is_using_SIMs = tk.BooleanVar()
is_using_SIMs.set(False)
is_using_F00 = tk.BooleanVar()
is_using_F00.set(False)
is_using_O000 = tk.BooleanVar()
is_using_O000.set(False)
is_using_ELSE = tk.BooleanVar()
is_using_ELSE.set(False)
length_var = tk.IntVar()
length_var.set(8)
Psw = tk.StringVar()
Psw.set('')
# step2:get length
frame1 = tk.Frame(root)
label = ttk.Label(frame1, text='密码长度:')
length = ttk.Combobox(frame1, textvariable=length_var, values=nums,
                      state='readonly')
length.bind('<<ComboboxSelected>>', lambda event: change_size())
label.grid(row=0, column=0, pady=1, padx=2)
length.grid(row=0, column=1, pady=1, padx=2)
frame1.pack(fill=tk.BOTH, expand=tk.YES, padx=20, pady=5)
# sept3: options
frame2 = tk.Frame(root)
sf1 = tk.Frame(frame2)
sf2 = tk.Frame(frame2)
cb1 = ttk.Checkbutton(sf1, variable=is_using_abcs, text="使用小写字母")
cb1.grid(row=0, column=0, pady=1, padx=2)
cb2 = ttk.Checkbutton(sf1, variable=is_using_ABCs, text="使用大写字母")
cb2.grid(row=0, column=1, pady=1, padx=2)
cb3 = ttk.Checkbutton(sf1, variable=is_using_SIMs, text="使用符号")
cb3.grid(row=0, column=2, pady=1, padx=2)
cb4 = ttk.Checkbutton(sf2, variable=is_using_F00, text="使用ascii码为161-500的特殊符号(有风险)")
cb4.grid(row=0, column=0, pady=1, padx=2)
cb5 = ttk.Checkbutton(sf2, variable=is_using_O000, text="使用ascii码为500-1000的特殊符号(有风险)")
cb5.grid(row=1, column=0, pady=1, padx=2)
cb5 = ttk.Checkbutton(sf2, variable=is_using_ELSE, text="使用ascii码为1000-10000的特殊符号(极其有风险)")
cb5.grid(row=2, column=0, pady=1, padx=2)
sf1.pack()
sf2.pack()
frame2.pack(fill=tk.BOTH, expand=tk.YES, padx=20, pady=5)
# step4:entry and button
frame3 = tk.Frame(root)
entry = ttk.Entry(frame3, textvariable=Psw)
entry.grid(row=0, column=0, pady=1, padx=2)
button1 = tk.Button(frame3, text="一键生成密码", command=give_me_a_psw)
button1.grid(row=0, column=1, pady=1, padx=2)
button2 = tk.Button(frame3, text="复制到剪贴板", command=copy)
button2.grid(row=0, column=2, pady=1, padx=2)
frame3.pack(fill=tk.BOTH, expand=tk.YES, padx=20, pady=5)
# step5:info bar
info = ttk.Label(root)
info.pack(fill=tk.BOTH, expand=True, padx=20, pady=5)
# step6:start!!!
if __name__ == '__main__':
    init()
    root.mainloop()

python3.4,pip19下成功运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值