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()
额外小建议
- 密码输入框加上
show="*",避免输入的密码明文显示,更符合常规体验 - 加个非空判断,防止用户空点注册按钮
- 导入模块可以更规范一点,比如用
import tkinter as tk代替from tkinter import *,避免命名冲突
内容的提问来源于stack exchange,提问作者Endemic
相关产品推荐
相关产品推荐

