Переменная пуста, даже если вы что-то напишите - PullRequest
0 голосов
/ 19 июня 2020

Когда я пытаюсь сгенерировать пароль, даже если вы вводите длину, 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)

Ответы [ 3 ]

2 голосов
/ 20 июня 2020
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', вам нужно преобразовать в float перед преобразованием в int, например:

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

EDIT:

Я нашел вашу переменную lengthstr в время, когда вы сделали это lengthstr = length.get(), запись будет '', которая является пустой строкой и не может быть преобразована в Int ..

Переместите lengthstr = length.get() в функцию генерации, чтобы ваша кнопка получила только поле ввода после того, как пользователь нажимает кнопку, а затем вы можете преобразовать в int ..

Удалите параметр функции, затем в команде просто вызовите функцию.

0 голосов
/ 20 июня 2020

Чтобы избежать этой ошибки, вам нужно позвонить .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 s, но это лучшее, что я могу сделать;)

Вы также можете попробовать использовать операторы try и except (например, ответ @ 10Rep, но с получением значения (.get()) и преобразованием в int в al oop и остановкой l oop в случае успеха.

0 голосов
/ 20 июня 2020

Причина, по которой вы получаете эту ошибку, вероятно, состоит в том, что вы ничего не ввели в Entry(). Чтобы избежать этой ошибки, используйте try и except.

Это будет создание кнопки:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...