首页 > 解决方案 > Tkinter 输入框值在 mongodb 中存储为 null

问题描述

我使用 tkinter 和 mongoengine 制作了一个简单的注册表单。但是由于某种原因,从 tkinter 输入框中获取的值在 mongodb 中存储为 null 或空。我想问题是该变量无法获取该值在 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 输出

正如您在输出中看到的那样,虽然用户输入了输入,但创建了 id 但用户名和密码字段为空。

标签: pythonmongodbtkintermongoengine

解决方案


这 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 !")

推荐阅读