• 1400/02/23

برنامه رمز یکبار مصرف :

سلام استاد. من یه برنامه نوشتم برای تولید رمز یکبار مصرف با پایتون و میخوام مثلا در مدت زمان 3 ثانیه یه رمز اتفاقی رو و بعد از زدن یک دکمه نمایش بده و بعد 3 ثانیه یه رمز جدید رو دوباره با زدن همون دکمه نشون بده. مشکلم اینجاست که بعد از یک بار استفاده از دکمه رمز رو میده هر چندبار که بزنم ولی ثانیه شمار کار نمیکنه.

import random,time
from tkinter import *
win=Tk()
win.title('Password generator')
win.minsize(400,200)
def PasswordMaker():

    e1.delete(0,'end')
    small_letters = list(map(chr, range(ord('a'), ord('z') + 1)))
    big_letters = list(map(chr, range(ord('A'), ord('Z') + 1)))
    digits = ""
    i = random.randint(0, 25)
    j = random.randint(0, 25)
    k = random.randint(0, 1)
    for _ in range(0, 6):
        digits += str(random.randint(0, 9))
    lst = list(big_letters[j] + small_letters[i] + digits)
    random.shuffle(lst)
    password="".join( lst[h] for h in range(8))
    password=str(password)
    e1.insert(END,password)

t = 3

def countdown():
    global t
    if t > 0:
        print(t)
        l1.config(text=t)
        t = t - 1
        l1.after(1000, countdown)
    elif t == 0:
        print('end')


lb=Label(win,text="Password Generator",font=('arial 20')).pack()
e1=Entry(win,font=('arial 13'))
e1.pack()
lb2=Label(win,text="Remaining Time :",font=('arial 10')).pack()
bt=Button(win,text="Generate",font=('arial 15'),fg='red',command=lambda :[PasswordMaker(),countdown()])
bt.pack()

l1 = Label(win, font='arial 20')
l1.pack()


win.mainloop()


 

یه مشکل دیگه هم که دارم اینه که میخوام کلید generate  رو تا ثانیه شمار صفر نشده از کار بندازم 

  • 1400/02/25
  • ساعت 10:16

سلام وقت بخیر

فکر کنم این لینک به دردتون بخوره

سمپلی رو پیاده سازی کرده که میتونید از کدهاش توی پروژتون استفاده کنید

https://www.geeksforgeeks.org/create-countdown-timer-using-python-tkinter/


  • 1400/02/25
  • ساعت 12:34

مرسی آقای مهدوی دیدم ولی مشکلی که تو سوالم توضیح دادم حل نشد بازم. من دقیقا یه چیزی مثل این برنامه های رمز ساز بانک ها میخوام


  • 1400/02/25
  • ساعت 14:30

حل شد مشکل کافی بود تایم رو در بدنه ی تابع PasswordMaker تعریف میکردم. در ضمن یه تغییر هم دادم که دکمه ی generate مادامی که تایمر صفر نشده از دسترس خارج بشه که رمز جدید تولید نکنه. کد اصلاح شده به شکل زیر:

import random,time
from tkinter import *
win=Tk()
win.title('Password generator')

def PasswordMaker():
    global  t
    e1.delete(0,'end')
    small_letters = list(map(chr, range(ord('a'), ord('z') + 1)))
    big_letters = list(map(chr, range(ord('A'), ord('Z') + 1)))
    digits = ""
    # password = ""
    i = random.randint(0, 25)
    j = random.randint(0, 25)
    k = random.randint(0, 1)
    for _ in range(0, 6):
        digits += str(random.randint(0, 9))
    lst = list(big_letters[j] + small_letters[i] + digits)
    random.shuffle(lst)
    password="".join( lst[h] for h in range(8))
    password=str(password)
    e1.insert(END,password)
    t=10 # زمان باید در اینجا قرار میگرفت
    bt['state']='disable' #این برای غیرفعال کردن دکمه



def countdown():
    global t
    if t >= 0:
        print(t)
        l1.config(text=t)
        t = t - 1
        l1.after(1000, countdown)
    elif t < 0:
        bt['state'] = 'normal' #برای فعال کردن دوباره ی دکمه


lb=Label(win,text="Password Generator",font=('arial 20')).pack()
e1=Entry(win,font=('arial 13'))
e1.pack()
lb2=Label(win,text="Remaining Time :",font=('arial 10')).pack()
# e2=Entry(win,font=('arial 13'))
# e2.pack()
bt=Button(win,text="Generate",font=('arial 15'),fg='red',command=lambda :[PasswordMaker(),countdown()])
bt.pack()

l1 = Label(win, font='arial 20')
l1.pack()


win.mainloop()


logo-samandehi