#python #tkinter
#python #tkinter
Вопрос:
Я пытаюсь создать систему входа в систему в Tkinter, используя Python. Итак, я хочу это сделать, запросив у пользователя имя пользователя. При нажатии кнопки далее поле имени пользователя должно исчезнуть, а вместо него должно появиться новое поле с именем password. Поэтому, когда я попытался это сделать, я получил сообщение об ошибке:
e1 is not defined in line 27, in button
Я понимаю, что переменная еще не была объявлена, но она должна была это сделать, поскольку я поместил все в функцию main() .
Это мой код
from tkinter import *
from tkinter import messagebox
root = Tk()
root.title("Loginsystem")
root.geometry("300x200")
def main():
def username_page():
Label(root, text="Username").place(x=10, y=10)
e1 = Entry(root)
e1.place(x=140, y=10)
uname = e1.get()
def password_page():
Label(root, text="Password").place(x=10, y=40)
e2 = Entry(root)
e2.place(x=140, y=40)
e2.config(show="*")
def button():
#Hide the username input field
e1.delete()
#Show the password input field
password_page()
username_page()
Button(root, text="Next", command=button, height = 3, width = 35, background = "blue", foreground = "white").place(x=10, y=100)
root.mainloop()
main()
Ответ №1:
from tkinter import *
from tkinter import messagebox
root = Tk()
root.title("Loginsystem")
root.geometry("300x200")
def main():
e1 = Entry(root) # MOVED E1 HERE
def username_page():
Label(root, text="Username").place(x=10, y=10)
e1.place(x=140, y=10)
uname = e1.get()
def password_page():
Label(root, text="Password").place(x=10, y=40)
e2 = Entry(root)
e2.place(x=140, y=40)
e2.config(show="*")
def button():
#Hide the username input field
e1.place_forget()
#Show the password input field
password_page()
username_page()
Button(root, text="Next", command=button, height = 3, width = 35, background = "blue", foreground = "white").place(x=10, y=100)
root.mainloop()
main()
e1
был объявлен в области действия username_page()
функции, поэтому он был доступен только в ней, а не снаружи. Тот факт, что username_page()
было объявлено внутри main()
, не означает e1
, что оно было объявлено в области вашего main()
.
Кроме того, e1.delete()
не работает, я полагаю, вы хотите e1.place_forget()
. Когда вы захотите e1
снова стать видимым, вы можете вызвать .place()
, как вы это делали в username_page()
.
Комментарии:
1.
e1.delete()
илиe1.delete(0)
не скрывает запись2. @SamakshGupta Ты прав, моя ошибка. Я отредактирую его.
3. Ухх, прошу прощения, но в коде сказано скрыть , уничтожение не является альтернативой скрытию. Может быть, использовать
.place_forget()
?4. @SamakshGupta Исправьте еще раз, я не знал об этом! Спасибо. Я бы удалил свой ответ, чтобы оставить ваш, поскольку наши программы почти идентичны, но мне не нравится использовать глобальные переменные практически в любой ситуации, поэтому я бы предпочел, чтобы OP выбирал оба варианта.
5. Ха-ха, да, наши ответы примерно одинаковы, но я боюсь, что вы ответили первым, поэтому вам не следует его удалять 🙂
Ответ №2:
Существует очень простой способ сделать это, не перемещая строки здесь и там, т. Е. объявляя e1
как глобальные.
Кроме того, скрытие не означает удаление, используется e1.place_forget()
для скрытия виджета
Вот код, который работает:
from tkinter import *
root = Tk()
root.title("Loginsystem")
root.geometry("300x200")
def username_page():
global e1, myLabel
myLabel = Label(root, text="Username")
myLabel.place(x=10, y=10)
e1 = Entry(root)
e1.place(x=140, y=10)
uname = e1.get()
def password_page():
Label(root, text="Password").place(x=10, y=40)
e2 = Entry(root)
e2.place(x=140, y=40)
e2.config(show="*")
def button():
# Hide the username input field
e1.place_forget()
myLabel.place_forget()
# Show the password input field
password_page()
def main():
username_page()
Button(root, text="Next", command=button, height = 3, width = 35, background = "blue", foreground = "white").place(x=10, y=100)
root.mainloop()
main()
Комментарии:
1. Круто! Это работает, но не удаляет текст имени пользователя. Есть ли аналогичный способ сделать это?
2. Ответ @lukas обновлен, чтобы включить его 🙂