为什么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
相关产品推荐
相关产品推荐

