先贴张图:
(本人的程序+它生成的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下成功运行。