Удаление в Tkinter Python

#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 обновлен, чтобы включить его 🙂