即使您写了一些东西,变量也是空的

2024-09-28 05:22:45 发布

您现在位置:Python中文网/ 问答频道 /正文

当我尝试生成密码时,即使输入长度,Python也会说变量lengthstr为空

这是Python给我的错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.6/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
  File "/home/salvatore/Python Projects/Password Saver/Ps.py", line 35, in <lambda>
    generatebutton = tk.Button(window, text="Genera", font=("Helvetica", 12, "bold"), bg="#007acc", activebackground="#66c2ff", command=lambda: generate(int(lengthstr)))
ValueError: invalid literal for int() with base 10: ''

这是我的密码:

def generate(length):
    return length
    chars = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&£*()?"
    passgen = "".join(choice(chars) for x in range(length))
    passwd = tk.Entry(window)
    passwd.insert(0, passgen)
    passwd.grid(row=5, column=0, sticky="N")

def generatepassword():
    generatefunction.destroy()
    seepassbutton.destroy()
    text.destroy()

    textgen = "Genera una Password"
    textgen = tk.Label(window, text=textgen, fg="#333333", font=("Helvetica", 32, "bold"))
    textgen.grid(row=0, column=0, sticky="N")

    length = tk.Entry(window, justify="center")
    length.grid(row=2, column=0, pady=10, ipadx=42)
    lengthstr = length.get()
    print(lengthstr)

    textgen = "Inserisci la lunghezza della Password"
    textgen = tk.Label(window, text=textgen, fg="#333333", font=("Helvetica", 10))
    textgen.grid(row=3, column=0, sticky="N")

    generatebutton = tk.Button(window, text="Genera", font=("Helvetica", 12, "bold"), bg="#007acc", activebackground="#66c2ff", command=lambda: generate(int(lengthstr)))
    generatebutton.config(relief="flat")
    generatebutton.grid(row=4, column=0, pady=6, ipady=1, ipadx=240)

Tags: lambdatextincolumnpasswordwindowlengthtk
3条回答

出现此错误的原因可能是您没有在Entry()中输入任何内容。要避免此错误,请使用tryexcept

这将是按钮的创建:

try:
    generatebutton = tk.Button(window, text="Genera", font=("Helvetica", 12, "bold"), bg="#007acc", activebackground="#66c2ff", command=lambda: generate(int(lengthstr)))
except (ValueError, NameError):
    pass

generatebutton.config(relief="flat")
generatebutton.grid(row=4, column=0, pady=6, ipady=1, ipadx=240)
def generate(length):
    #This `return length` won't let your logic in this function run
    return length
    chars = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&£*()?"
    passgen = "".join(choice(chars) for x in range(length))
    passwd = tk.Entry(window)
    passwd.insert(0, passgen)
    passwd.grid(row=5, column=0, sticky="N")

但错误来自于对按钮的命令

generatebutton = tk.Button(window, ...., command=lambda: generate(int(lengthstr)))

您试图将无效文字转换为int,lengthstr的值是多少?如果它是浮点文本,例如“1.5”,则必须先转换为浮点,然后再转换为int,如下所示:

 generatebutton = tk.Button(window, ..., command=lambda:generate(int(float(lengthstr)))

编辑:

我找到了您的lengthstr变量,在执行此操作时lengthstr = length.get()条目将是'',这是一个空字符串,无法转换为Int

lengthstr = length.get()移动到generate函数中,这样,用户单击按钮后,您的按钮只会获得输入字段,然后您就可以转换为int

删除函数参数,然后在命令中调用函数

为避免此错误,您只需在用户输入文本时调用.get();为此,我建议使用按钮:

def getTextFromEntry(theEntry):
    global lengthstr
    lengthstr = length.get()
    print(lengthstr)

def generatepassword():
    generatefunction.destroy()
    seepassbutton.destroy()
    text.destroy()

    textgen = "Genera una Password"
    textgen = tk.Label(window, text=textgen, fg="#333333", font=("Helvetica", 32, "bold"))
    textgen.grid(row=0, column=0, sticky="N")

    length = tk.Entry(window, justify="center")
    length.grid(row=2, column=0, pady=10, ipadx=42)
    getValue = Button(text="Generate password", command=getTextFromEntry)
    getValue.pack()
    textgen = "Inserisci la lunghezza della Password"
    textgen = tk.Label(window, text=textgen, fg="#333333", font=("Helvetica", 10))
    textgen.grid(row=3, column=0, sticky="N")

    generatebutton = tk.Button(window, text="Genera", font=("Helvetica", 12, "bold"), bg="#007acc", activebackground="#66c2ff", command=lambda: generate(int(lengthstr)))
    generatebutton.config(relief="flat")
    generatebutton.grid(row=4, column=0, pady=6, ipady=1, ipadx=240)

(我确信使用lambda可以更容易地做到这一点,但这是我能做到的最好的方法;)

您还可以尝试在循环中使用tryexcept语句(如@10Rep的答案,但获取值(.get())和转换为int),并在成功时停止循环

相关问题 更多 >

    热门问题