You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter输入框值存入MongoDB时为Null的问题求助

嘿,这问题我太熟啦!你踩了Tkinter新手常犯的一个小坑——你获取输入框内容的时机不对!

问题出在哪?

看你这段代码:

entry1 = Entry(frame)
entry2 = Entry(frame)
name = entry1.get()  # 这里!GUI刚启动就获取值,此时输入框是空的!
pwd = entry2.get()

当你刚创建完输入框就调用.get(),这时候用户还没输入任何内容,所以name和pwd从一开始就是空字符串。之后不管用户在输入框里填了什么,你点击注册按钮时用的还是最开始的空值,自然存到MongoDB里就是null/空啦。

怎么修复?

把获取输入框内容的代码移到register()函数里面,这样每次点击注册按钮时,才会实时读取用户当前输入的内容:

修正后的完整代码:

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():
    # 在这里获取输入框的实时内容!
    name = entry1.get()
    pwd = entry2.get()
    
    # 加个简单的非空判断,避免空提交
    if not name or not pwd:
        tkinter.messagebox.showwarning("提示", "用户名和密码不能为空!")
        return
    
    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)
# 密码框可以加show参数,输入时显示星号更安全
entry2 = Entry(frame, show="*")

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()

额外小建议

  1. 密码输入框加上show="*",避免输入的密码明文显示,更符合常规体验
  2. 加个非空判断,防止用户空点注册按钮
  3. 导入模块可以更规范一点,比如用import tkinter as tk代替from tkinter import *,避免命名冲突

内容的提问来源于stack exchange,提问作者Endemic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:56:51