我正在尝试构建一个随机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()
答案 0 :(得分:0)
我运行了您的脚本,没有收到任何错误,但是您至少犯了一个错误(可以说是更多)。
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
。
如果您想清理整个脚本。您可能需要考虑以下因素:
除非您打算对Labels
做一些事情,例如:更改其文本或将其完全删除,否则没有理由存储对其的引用。
textvariable
期望tk.StringVar()
,将任意str
转储到其中(对我而言)无济于事,但可能是错误的根源。
用户无需单击Button
即可生成任意随机数。您只需在程序执行后立即自动生成它即可。
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()