Значения поля ввода Tkinter хранятся как ноль в mongodb - PullRequest
0 голосов
/ 29 мая 2018

Я сделал простую регистрационную форму, используя tkinter и mongoengine. Но по какой-то причине значение, взятое из полей ввода tkinter, хранится как пустое или пустое в mongodb. Думаю, проблема в том, что переменная не можетвозьмите значение, введенное в поле ввода tkinter, но я не могу найти решение этой проблемы, поскольку код выглядит синтаксически правильным.

from tkinter import *
import tkinter.messagebox
from mongoengine import *

connect('demo')

class Registration(Document):
    username = StringField(required=True,unique=True)
    password = StringField(required=True)

def register():
if len(Registration.objects(username=name)) == 1:
    tkinter.messagebox.showinfo("Oops!", "Username already taken")
else:
    entry = Registration(
        username=name,
        password=pwd
    )
    entry.save()
    tkinter.messagebox.showinfo("Notice", "Registered Successfully !")

# GUI
root = Tk()
root.title("Registration Demo")

frame = Frame(root,width=500,height=500)
frame.pack()
label1 = Label(frame,text="username")
label2 = Label(frame,text="password")

entry1 = Entry(frame)
entry2 = Entry(frame)
name = entry1.get()
pwd = entry2.get()

button = Button(frame,text="Register",command=register)

label1.grid(row=0,column=0,sticky=E)
label2.grid(row=1,column=0,sticky=E)
entry1.grid(row=0,column=1)
entry2.grid(row=1,column=1)
button.grid(columnspan=2)

root.mainloop()

А вот представление таблицы mongodb: Вывод Mongodb

Как видно из выходных данных, идентификатор создан, но поля имени пользователя и пароля не заполнены, хотя пользователь ввел ввод.

1 Ответ

0 голосов
/ 29 мая 2018

Эти 2 строки:

name = entry1.get()
pwd = entry2.get()

не делают то, что, как вы думаете, они делают, и вы можете просто удалить их, поскольку они не помогают никому.

То, что происходит, является значениемentry1 и entry2 собираются в начале вашей программы, и это всегда будет равно пустому значению, потому что оно вызывается 1 раз сразу при запуске программы.Это происходит только один раз и не обновляется, когда вы ссылаетесь на переменную name или pwd.Вам нужно вызвать entry1.get() и entry2.get() изнутри вашей функции.

Изменить это:

def register():
    if len(Registration.objects(username=name)) == 1:
        tkinter.messagebox.showinfo("Oops!", "Username already taken")
    else:
        entry = Registration(
            username=name,
            password=pwd
        )
        entry.save()
        tkinter.messagebox.showinfo("Notice", "Registered Successfully !")

На это:

def register():
    if len(Registration.objects(username=entry1.get())) == 1:
        tkinter.messagebox.showinfo("Oops!", "Username already taken")
    else:
        entry = Registration(
            username=entry1.get(),
            password=entry2.get()
        )
        entry.save()
        tkinter.messagebox.showinfo("Notice", "Registered Successfully !")
...