Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Autres langages > [Python] Programme qui génere un mot de pass aléatoire > Lecture du sujet

[Python] Programme qui génere un mot de pass aléatoire

Problème d'algorythme ou d'utilisation de Tkinter ?

Vous devez être inscrit pour pouvoir poster des messages

Page : 1 
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : 1 
Hors ligne djidis # Posté le 07/07/2008 à 11:42:07
Groupe : Membres
Bonjour les Zéros,
Voilà, voulant tester mes connaissances, j'ai décider de faire un générateur de mot de pass aléatoire. Quand je démarre mon programme il n'affiche pas le mot de pass généré.

Voici le code "d'erreur" :

Code : Console
Traceback <most ecent call last>:
File "C:\Python24\lib\lib-tk\Tkinter.py", line 1345, in __call__ return self.func<*args>
File "G:\modepss.py", lie 17, in aleatoire motDePass[n] = liste[c] #Liste motDePass ms a jor
IndexError: list assignment index out of range


Et mon script :

Code : Python
 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
#! /usr/bin/env python

#On importe les fonctions utiles !
from Tkinter import *
from whrandom import *

#Définition des fonctions

#Fonction aleatoire
def aleatoire(event):
	liste = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9']
	motDePass = []
	n = 0
<gras>	compteur = str(eval(nombreDeCaractere.get()))</gras>
	while n<=compteur:
		c = int(random()*62) #Tire au sort un nombre entre 0 et 61
<gras>		motDePass[n] = liste[c] #Liste motDePass mis a jour</gras>
		n = n + 1
	global liste,motDePass,n,c
<gras>	affpass['text'] = 'Ton Pass:' + motDePass #On renvois le pass a afficher</gras>
	
#PROGRAMME PRINCIPAL

fenetre = Tk()
lab1 = Label(fenetre, text='Longueur de ton pass:')
nombreDeCaractere = Entry(fenetre)
nombreDeCaractere.bind("<Return>", aleatoire)
affpass = Label(fenetre)
quitter = Button(fenetre,text='Quitter !',command=fenetre.quit)

lab1.grid(row = 1, column = 1)
nombreDeCaractere.grid(row = 1, column = 2)
affpass.grid(row = 2, column = 1, columnspan = 2)
quitter.grid(row = 3, column = 2)
fenetre.mainloop()


J'ai entouré par <gras> les lignes qui sont pour moi celles qui on le plus de chance d'être défectueuse.

Merci de pouvoir m'aider à trouver mon problème et bonne journée,
Djidis
Hors ligne --alex--- # Posté le 07/07/2008 à 12:49:53
Avatar
Groupe : Membres
Pour Tkinter je ne sais pas mais il y a déjà énormément de choses à améliorer. Déjà pour les lettres il y a beaucoup plus rapide plutôt que de les énumérer. Le module string définit des chaines qui les contiennent déjà :
Code : Python
1
2
3
import string
liste_char=string.ascii_letters+string.digits
print liste_char

Ensuite tu as la structure du for pour ta boucle et pour la sélection du mot de passe. Il faut mieux utiliser le module random et la fonction randint de ce module.
Code : Python
1
2
3
4
import random
passwd=""
for i in range(compteur):
    passwd+=liste_char[random.randint(0,len(liste_char)-1)]


Comme ça tu as directement une chaîne de caractère (alors que tu passais une liste à ton label ce qui est une erreur).
Normalement ton problème devrait être réglé puisqu'il se trouvait au moment de la génération du mot de passe.

PS : pour ton erreur, même si je ne suis pas sûr je pense que c'est au niveau du random()*62. Si je ne me trompe pas random() renvoie un float entre 0 et 1. Or s'il vaut 1, l'index sera 62. Or ta liste fait 62 de longueur et comme en Python on commence à compter les cases à partir de 0, cela signifie que l'index maximal n'est pas 62 mais 61 !

Édité le 07/07/2008 à 13:21:53 par --alex---
Connecté wgmpgp # Posté le 07/07/2008 à 14:46:30
Rotoclap true fan
Avatar
Groupe : Membres
Son erreur vient du fait que motDePass est une liste vide, et qu'il fait motDePass[n] = ...
 
Hors ligne djidis # Posté le 07/07/2008 à 18:31:40
Groupe : Membres
Merci beaucoup :D
Hors ligne MrGecko # Posté le 07/07/2008 à 19:42:11
Avatar
Groupe : Membres
autre solution, en utilisant la fonction sample de Python:

Code : Python
 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
# -*- coding: cp1252 -*-

import string
from random import sample

# lettres min + lettres maj + chiffres
pop = string.ascii_letters + string.digits
# le mot de passe fera 12 caractères de long
k=12

# sample retourne une portion aléatoire et de taille k à partir de la séquence pop
passwd = ''.join( sample(pop, k) )
print pop
print passwd

print "=========================================="
#la seule restriction ici c'est que k ne peut pas être supérieur
# à la taille de la population, si tu veux un mdp plus long, il faut agrandir
# la population, d'une manière ou d'une autre :

k=200

# exemple simple
while k > len(pop):
    pop *= 2
    
passwd = ''.join(sample(pop, k))
    
print pop
print passwd
Édité le 07/07/2008 à 19:43:23 par MrGecko

>
 

Retour au forum "Autres langages" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 304 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.0243s (0.0094s)