通过python生成OTP

时间:2020-10-10 13:20:35

标签: python tkinter

我正在尝试构建一个随机OTP生成器,但是遇到此错误消息,有人可以帮助我

错误:

File "C:\Users\HP\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 2692, in insert
    self.tk.call(self._w, 'insert', index, string)
_tkinter.TclError: wrong # args: should be ".!entry3 insert index text"

我的代码:

import random
from tkinter import *
from tkinter.ttk import *

root = Tk()

#generting otp
def generate():
    entry.delete(0,END)
    digits = "0123456789"
    otp1 =""
    for i in range (4):
        opt1 = otp1 + random.choice (digits)

    entry.insert(10,otp1)


#GUI

Usn_label = Label(root , text = "USN")
Usn_label.grid(row = 0 )
Usn_entry = Entry(root , textvariable='usn_var')
Usn_entry.grid(row =0 , column = 1)

phone_label = Label (root , text = " Phone Number ")
phone_label.grid (row = 2)
phone_entry = Entry (root , textvariable='phone number')
phone_entry.grid(row = 2, column = 1)
Gen_label =Button(root , text= 'Generate', command = generate)
Gen_label.grid (row = 3 , column = 1 , sticky='w')

Random_otp = Label (root, text = "OTP")
Random_otp.grid (row = 4 )
entry = Entry(root)
entry.grid(row = 4, column = 1)

root.title("Otp Generator ")

root.mainloop()

1 个答案:

答案 0 :(得分:0)

我运行了您的脚本,没有收到任何错误,但是您至少犯了一个错误(可以说是更多)。

  1. 您删除输入文本,但尝试在索引10处插入文本
  2. 您在循环中误拼了otp1(作为“ opt1”)

#generting otp
def generate(L=4):
    entry.delete(0, END)
    entry.insert(0, f'{random.choice(range(0, pow(10, L)))}'.zfill(L))

我相信这要干净得多。逻辑很简单。生成一个介于0到9999之间的数字,并为少于4个字符的数字在左侧填充零。对于更长或更短的数字,只需更改L

如果您想清理整个脚本。您可能需要考虑以下因素:

  1. 除非您打算对Labels做一些事情,例如:更改其文本或将其完全删除,否则没有理由存储对其的引用。

  2. textvariable期望tk.StringVar(),将任意str转储到其中(对我而言)无济于事,但可能是错误的根源。

  3. 用户无需单击Button即可生成任意随机数。您只需在程序执行后立即自动生成它即可。

  4. Labels诸如“ USN”和“ OTP”之类的文字并不友好。


import random
import tkinter as tk

root = tk.Tk()
root.title("OTP Generator ")

def random_key(L=4):
    return f'{random.choice(range(0, pow(10, L)))}'.zfill(L)

#generate otp for this session
otp = random_key(8)

#GUI
tk.Label(root, text="Username:", anchor='e').grid(row=0, sticky='e')

usn_entry = tk.Entry(root)
usn_entry.grid(row=0 , column=1, sticky='w')

tk.Label(root, text="Phone Number:", anchor='e').grid(row=2, sticky='e')

phone_entry = tk.Entry(root)
phone_entry.grid(row=2, column=1, sticky='w')

tk.Label(root, text="PIN:", anchor='e').grid(row=4, sticky='e')

pin = tk.Entry(root, width=len(otp))
pin.grid(row=4, column=1, sticky='w')
pin.insert(0, otp)
pin.configure(state='read')

root.mainloop()      

如果您想更进一步,可以考虑不断重复创建相同的Label / Entry组合。您可以简单地创建一个代表该组合的class,然后使用它。

import random
import tkinter as tk

class LabeledEntry(tk.Frame):
    @property
    def text(self) -> str:
        return self.__entry.get()
        
    @text.setter
    def text(self, value:str):
        self.__entry.delete(0, 'end')
        self.__entry.insert(0, value)
    
    @property    
    def entry(self) -> tk.Entry:
        return self.__entry
        
    @property
    def state(self) -> str:
        return self.__entry['state']
        
    @state.setter
    def state(self, value:str):
        self.__entry.configure(state=value)
        
    def __init__(self, master, text:str, column=None, row=None, **kwargs):
        tk.Frame.__init__(self, master, **kwargs)
        self.grid(column=column, row=row)
        
        tk.Label(self, text=text, anchor='e', width=12).grid(row=0, column=0, sticky='e')
        
        self.__entry = tk.Entry(self)
        self.__entry.grid(row=0, column=1, sticky='w')
        

root = tk.Tk()
root.title("OTP Generator ")

def random_key(L=4):
    return f'{random.choice(range(0, pow(10, L)))}'.zfill(L)

#generate otp for this session
otp = random_key(8)

#GUI
user_field  = LabeledEntry(root, 'Username: ')
phone_field = LabeledEntry(root, 'Phone Number: ')
pin_field   = LabeledEntry(root, 'PIN: ')

pin_field.text  = otp
pin_field.state = 'read'

root.mainloop()      

    
    
相关问题