通过python生成OTP

通过python生成OTP,python,tkinter,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 &q

我试图建立一个随机的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()

我运行了你的脚本,没有出现任何错误,但你至少犯了一个错误(可以说更多)

  • 删除条目文本,然后尝试在索引10处插入文本
  • 您在循环中拼错了
    otp1
    (作为“opt1”)

  • 我相信这更干净。逻辑非常简单。生成一个从0到9999的数字,对于少于4个字符的任何数字,在左侧填充零。对于较长或较短的数字,只需更改
    L

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

  • 除非您打算对
    标签执行某些操作,例如:更改它们的文本或完全删除它们,否则没有理由存储对它们的引用

  • textvariable
    需要一个
    tk.StringVar()
    ,将任意的
    str
    转储到其中(对我来说)没有任何作用,但可能是您的错误源

  • 用户无需单击
    按钮
    即可生成任意随机数。只要程序一执行,您就可以自动生成它

  • 带有“USN”和“OTP”等文本的标签
    对用户不友好


  • 如果你想把它做得更远,你可以考虑不断地创建同一个<代码>标签<代码> >代码>条目组合。您只需创建一个表示该组合的

    ,然后使用它即可

    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()      
    
        
        
    

    您的问题与OTP有什么关系?这是关于使用tkinter.Entry小部件的错误?请编辑标题以正确反映您的问题。这是否回答了您的问题?
    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()      
    
    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()