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

为什么tkinter Entry组件多窗口下返回空字符串,单窗口却运行正常?

问题根因

你的代码核心问题是在tkinter中同时创建了多个Tk()主窗口实例:

  • 每个Tk()实例都对应独立的Tcl解释器上下文,不同上下文的变量互不互通
  • 你声明的StringVar()默认绑定到第一个创建的Tk()主窗口,和第二个新建的Tk()窗口没有关联,所以永远读不到第二个窗口Entry控件的输入值
  • 给第二个窗口额外添加的mainloop()也是多余的,同一个程序只需要运行一次主循环
修复方案

把第二个窗口的创建逻辑从Tk()改为Toplevel(),这是tkinter专门用来创建次级弹窗的组件,和主窗口共用同一个Tcl上下文,变量绑定自然生效。

修改后完整代码
from tkinter import *
import pymysql
class Sample():
    def __init__(self,root):
        self.root = root
        self.root.geometry("200x200")
        S_Button = Button(root,text="Open entry Box",command=self.add).pack()

    def add(self):
        # 改用Toplevel创建次级窗口,不要新建Tk实例
        self.second = Toplevel()
        self.second.geometry("500x200")

        self.SRN = StringVar()
        S_entry = Entry(self.second,textvariable=self.SRN).pack()

        S_Button2 = Button(self.second,text="Store in Database",command=self.data).pack()
        # 去掉多余的second.mainloop()

    def data(self):
        print(self.SRN.get())
        # 原数据库操作逻辑存在语法错误,修正参考:
        # con = pymysql.connect(host="localhost",user="root",password="",database="stm")
        # cur = con.cursor()
        # # 参数单独放在第二个元组中,不要拼接进SQL字符串,避免语法错误和SQL注入
        # cur.execute("insert into StudentsData values (%s)", (self.SRN.get(),))
        # con.commit()
        # con.close()

if __name__ == "__main__":
    root = Tk()
    app = Sample(root)
    root.mainloop()
额外注意事项
  • 原代码的SQL执行语句存在语法问题,execute的参数要单独放在第二个元组参数里,不要拼在SQL字符串中
  • 所有次级窗口都应该用Toplevel创建,整个程序只保留一个Tk()实例即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:45:04