1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
| # /usr/bin/env python
# -*- coding:Utf-8 -*-
# Importation des modules
# Sans importance ici mais évitez from tkinter import *
from tkinter import *
from tkinter import messagebox
# Je ne vois pas l'interet de ttk
import random
# Définition des variables
selection = ("ABCDEFGHJKMNPQRSTUVWXYZ", "abcdefghjkmnpqrstuvwxyz", \
"23456789", "#*/-+:\_&%!?")
liste = ["ABCDEFGHJKMNPQRSTUVWXYZ", "abcdefghjkmnpqrstuvwxyz", "23456789"]
random.shuffle(liste)
# global inutile
# Pour la logique de combine/generate je vous laisse seul maitre.
def combine(x):
option = ((var_maj, 0), (var_min, 1), (var_num, 2), (var_spe, 3))
if option[x][0].get() == True:
liste.append(selection[option[x][1]])
else:
liste.remove(selection[option[x][1]])
def generate():
"Génération du mot de passe"
if liste:
# Voir le return
nb = nbcar_callback()
if nb: # != None
if nb < 4 or nb > 30:
messagebox.showinfo(title="Gpwd",
message="minumum 4 caractères, \
maximum 30 caractères")
else:
compteur = 0
position = -1
D = []
while compteur < nb:
if position < len(liste) - 1:
position += 1
else:
position = 0
D += random.sample(liste[position], 1)
compteur += 1
random.shuffle(D)
D = "".join(D)
password.set(D)
else:
# nb == None
messagebox.showinfo(title="Gpwd",
message="Veuillez indiquer un nombre de \
caractère pour le mot de passe")
else:
messagebox.showinfo(title="Gpwd",
message="Veuillez choisir au moins une option")
def addtoclip():
text = password.get()
if text:
fenetre.clipboard_clear()
fenetre.clipboard_append(text)
else:
messagebox.showinfo(title="Gpwd", message="Merci de générer un mot \
de passe en appuyant sur -Entrée-")
def nbcar_callback(*args):
# On controle la saisie utilisateur.
# Il est possible de passer par la validation de l'Entry (voir validate)
# mais c'est largement suffisant ici.
nb = nbcar.get()
if nb: # != ''
# On tente de convertir en int
try:
nb = int(nb)
return nb # Pour generate()
except ValueError:
nbcar.set("7")
messagebox.showinfo(title="Gpwd", message="Valeur invalide")
def windowcenter(widget):
"Placer la fenêtre au centre"
widget.update()
w = widget.winfo_reqwidth()
h = widget.winfo_reqheight()
px = (widget.winfo_screenwidth() / 2) - (w / 2)
py = (widget.winfo_screenheight() / 2) - (h / 2)
widget.geometry("%dx%d+%d+%d" % (w, h, px, py))
widget.resizable(width=False, height=False)
def showlogin():
passwords = [('root', 'pass'), ('admin', 'root'), ('austin57', 'austin57')]
def verifpass():
if (utilisateur.get(), mdp.get()) in passwords:
toplogin.destroy()
fenetre.deiconify()
else:
toplogin.destroy()
fenetre.destroy()
toplogin = Toplevel(fenetre)
Label(toplogin, text="Utilisateur:").grid(row=0, column=0)
utilisateur = Entry(toplogin, show='*', justify=CENTER)
utilisateur.grid(row=0, column=1)
Label(toplogin, text="Mot de passe:").grid(row=1, column=0)
mdp = Entry(toplogin, show="*", justify=CENTER)
mdp.grid(row=1, column=1)
windowcenter(toplogin)
utilisateur.bind('<Return>', lambda e: mdp.focus_set())
utilisateur.bind("<KP_Enter>", lambda e: mdp.focus_set())
mdp.bind('<Return>', lambda e: verifpass())
mdp.bind("<KP_Enter>", lambda e: verifpass())
utilisateur.focus_set()
# Création de l'interface graphique
fenetre = Tk()
# On cache la fenetre le temps de la creer
fenetre.withdraw()
fenetre.title("Gpwd")
# Création des widgets checkbutton
var_maj = BooleanVar(value=True)
var_min = BooleanVar(value=True)
var_num = BooleanVar(value=True)
var_spe = BooleanVar(value=False)
# Un Widget Entry contient du texte. Utiliser IntVar c'est s'exposer à un ValueError
# de la classe Variable elle même.
nbcar = StringVar(value="7")
nbcar.trace("w", nbcar_callback)
password = StringVar()
Checkbutton(fenetre, text="Majuscules", variable=var_maj,
command=lambda: combine(0), onvalue=True,
offvalue=False).grid(column=1, row=1, sticky=W, padx=3, pady=3)
Checkbutton(fenetre, text="Minuscules", variable=var_min,
command=lambda: combine(1), onvalue=True,
offvalue=False).grid(column=1, row=2, sticky=W, padx=3, pady=3)
Checkbutton(fenetre, text="Chiffres", variable=var_num,
command=lambda: combine(2), onvalue=True,
offvalue=False).grid(column=2, row=1, sticky=W, padx=3, pady=3)
Checkbutton(fenetre, text="Spéciaux", variable=var_spe,
command=lambda: combine(3), onvalue=True,
offvalue=False).grid(column=2, row=2, sticky=W, padx=3, pady=3)
Label(text="Nbre de caractère pour le mot de passe").grid(column=1, row=3,
columnspan=2,
sticky='W',
padx=3, pady=1)
Label(text="Mot de passe").grid(column=1, row=5, columnspan=2, sticky='W',
padx=3, pady=1)
# Pour le focus
label_nbcar = Entry(textvariable=nbcar)
label_nbcar.grid(column=1, row=4, columnspan=2, sticky='WE', padx=3, pady=3)
Entry(textvariable=password).grid(column=1, row=6, columnspan=2, sticky='WE',
padx=3, pady=3)
Button(text="Copier dans le presse-papier",
command=addtoclip).grid(column=1, row=7, columnspan=2, sticky='WE',
padx=3, pady=3)
fenetre.bind('<Return>', lambda e: generate())
# Pavé numérique
fenetre.bind("<KP_Enter>", lambda e: generate())
windowcenter(fenetre)
label_nbcar.focus_set()
label_nbcar.icursor(1) # On se positionne après le "7"
showlogin()
fenetre.mainloop() |
Partager