一. 前提背景
最近由于一个项目的需要,需要生成复杂的密码的,想着太累,就用python做了这个密码生成器,直接上图。
二. 实现的难点
python如果没有QT库的支持,单单用代码来控制界面元素那是相当累人,QT库又很大,安装麻烦。正好找到了一个利用vb生成python界面代码Tkinter开源的库tkinter-designer,相关库地址tkinter-designer 支持大部分控件。
用VB来画界面那是相当的容易哈哈哈。
画好界面后,导出相关的框架代码。
三.实现多线程生成密码
关键代码如下:
# 定义点击使用多线程 生成函数create_password def do_with_threading(self, pwd_bit = 10, pwd_create_char = '0000'): thr = threading.Thread(target = self.create_password(pwd_bit, pwd_create_char)) thr.start() # 生成函数 create_password def create_password(self, pwd_bit, pwd_create_char): password_str_0 = '1234567890' password_str_1 = 'abcdefghijkmnopqrstuvwsyz' password_str_2 = 'ABCDEFGHIJKLMNOPQRSTUVWSYZ' password_str_3 = '!@#$%&*?' create_list_str = list(pwd_create_char) password_str = '' for index in range(len(create_list_str)): if create_list_str[index] == '1': str_index = str(index) index_password_str = eval('password_str_' + str_index) password_str = password_str + index_password_str the_password = '' for bit in range(int(pwd_bit)): the_password = the_password + random.choice(password_str) self.txt_1Var.set(the_password) pass 四. 完整代码 #!/usr/bin/env python #-*- coding:utf-8 -*- import os, sys, threading, random import tkMessageBox if sys.version_info[0] == 2: from Tkinter import * from tkFont import Font from ttk import * #Usage:showinfo/warning/error,askquestion/okcancel/yesno/retrycancel from tkMessageBox import * #Usage:f=tkFileDialog.askopenfilename(initialdir='E:/Python') #import tkFileDialog #import tkSimpleDialog else: #Python 3.x from tkinter import * from tkinter.font import Font from tkinter.ttk import * from tkinter.messagebox import * #import tkinter.filedialog as tkFileDialog #import tkinter.simpledialog as tkSimpleDialog #askstring() class Application_ui(Frame): #这个类仅实现界面生成功能,具体事件处理代码在子类Application中。 def __init__(self, master=None): Frame.__init__(self, master) self.master.title('密码生成器') self.master.geometry('312x320+597+241') self.createWidgets() def createWidgets(self): self.top = self.winfo_toplevel() self.style = Style() self.Text2Var = StringVar(value='15') self.Text2 = Entry(self.top, textvariable=self.Text2Var, font=('宋体',9)) self.Text2.place(relx=0.256, rely=0.4, relwidth=0.516, relheight=0.078) self.txt_1Var = StringVar(value='') self.txt_1 = Entry(self.top, textvariable=self.txt_1Var, font=('宋体',18)) self.txt_1.place(relx=0.077, rely=0.575, relwidth=0.798, relheight=0.128) self.style.configure('Tbtn_create.TButton', font=('宋体',9)) self.btn_create = Button(self.top, text='生成', command=self.btn_create_Cmd, style='Tbtn_create.TButton') self.btn_create.place(relx=0.205, rely=0.825, relwidth=0.567, relheight=0.128) self.chk_4Var = IntVar(value=1) self.style.configure('Tchk_4.TCheckbutton', font=('宋体',9)) self.chk_4 = Checkbutton(self.top, text='特殊字符', variable=self.chk_4Var, style='Tchk_4.TCheckbutton') self.chk_4.place(relx=0.538, rely=0.25, relwidth=0.234, relheight=0.103) self.chk_3Var = IntVar(value=1) self.style.configure('Tchk_3.TCheckbutton', font=('宋体',9)) self.chk_3 = Checkbutton(self.top, text='大写字母', variable=self.chk_3Var, style='Tchk_3.TCheckbutton') self.chk_3.place(relx=0.077, rely=0.25, relwidth=0.234, relheight=0.103) self.chk_2Var = IntVar(value=1) self.style.configure('Tchk_2.TCheckbutton', font=('宋体',9)) self.chk_2 = Checkbutton(self.top, text='小写字母', variable=self.chk_2Var, style='Tchk_2.TCheckbutton') self.chk_2.place(relx=0.538, rely=0.1, relwidth=0.285, relheight=0.063) self.chk_1Var = IntVar(value=1) self.style.configure('Tchk_1.TCheckbutton', font=('宋体',9)) self.chk_1 = Checkbutton(self.top, text='数字', variable=self.chk_1Var, style='Tchk_1.TCheckbutton') self.chk_1.place(relx=0.077, rely=0.1, relwidth=0.285, relheight=0.063) self.style.configure('Tlab_1.TLabel', anchor='w', font=('宋体',9)) self.lab_1 = Label(self.top, text='位数:', style='Tlab_1.TLabel') self.lab_1.place(relx=0.077, rely=0.4, relwidth=0.157, relheight=0.078) class Application(Application_ui): #这个类实现具体的事件处理回调函数。界面生成代码在Application_ui中。 def __init__(self, master=None): Application_ui.__init__(self, master) master.iconbitmap(os.path.dirname(os.path.abspath(__file__))+"\\ico\\dog.ico") def btn_create_Cmd(self, event=None): #TODO, Please finish the function here! self.txt_1Var.set('') pwd_bit = self.Text2Var.get() #密码位数 is_number = self.chk_1Var.get() # 是否包含数字 is_small_letter = self.chk_2Var.get() #是否包含小写字母 is_big_letter = self.chk_3Var.get() #是否包含大写字母 is_spe_char = self.chk_4Var.get() #是否特殊字符 pwd_create_char = str(is_number) + str(is_small_letter) + str(is_big_letter) + str(is_spe_char) if pwd_create_char == '0000': tkMessageBox.showinfo( u"软件提示", u'请选择生成规则') return self.do_with_threading(pwd_bit, pwd_create_char) pass def do_with_threading(self, pwd_bit = 10, pwd_create_char = '0000'): thr = threading.Thread(target = self.create_password(pwd_bit, pwd_create_char)) thr.start() def create_password(self, pwd_bit, pwd_create_char): password_str_0 = '1234567890' password_str_1 = 'abcdefghijkmnopqrstuvwsyz' password_str_2 = 'ABCDEFGHIJKLMNOPQRSTUVWSYZ' password_str_3 = '!@#$%&*?' create_list_str = list(pwd_create_char) password_str = '' for index in range(len(create_list_str)): if create_list_str[index] == '1': str_index = str(index) index_password_str = eval('password_str_' + str_index) password_str = password_str + index_password_str the_password = '' for bit in range(int(pwd_bit)): the_password = the_password + random.choice(password_str) self.txt_1Var.set(the_password) pass if __name__ == "__main__": top = Tk() Application(top).mainloop()
五. 附件代码下载