tkinter中Entry绑定StringVar调用get()返回长度为0的空字符串如何解决
问题原因
- 你在已有Tkinter主程序的前提下,在回调函数中额外创建了新的
Tk()实例,多Tk()实例会导致变量上下文隔离,默认创建的StringVar会绑定到最早初始化的Tk()主窗口,和当前新窗口内的Entry组件上下文不匹配,无法同步输入内容。 - 当前代码中新创建的第二个
Tk窗口没有调用mainloop()方法启动事件循环,窗口组件的交互状态无法同步到绑定变量,且edit函数执行完毕后,局部作用域的var3、entryo等变量可能被回收,导致变量失效。
修复方案
Tkinter多窗口场景下优先使用Toplevel创建子窗口,不要额外新建Tk()实例,修改后的代码如下:
from tkinter import * # 此处假设你已有初始化的主窗口实例,示例: # main_root = Tk() def edit(): # 用Toplevel创建子窗口,自动继承主窗口的事件循环 root = Toplevel() root.title('EDIT-CONTACTS') can2 = Canvas(root,width = 800,height = 1000,bg = '#FFE4C4') can2.pack() def gop(): sget = var3.get() print(sget) can2.create_text(380,30,text= 'ENTER A NAME TO EDIT',font = 'comicsansms 10 bold') can2.create_text(100,200,text= 'NAME : ',font = 'comicsansms 9 italic') # 显式指定master确保变量绑定到当前窗口,避免上下文错乱 var3 = StringVar(master=root) entryo = Entry(root, textvariable = var3 ,bd = 7,font = 'comicsansms 8 bold') entryy = can2.create_window(480,200,window= entryo) b = Button(root,text= 'Press',command=gop) b.place(x=500,y=500) # 主窗口事件循环统一处理所有窗口的交互,不需要给子窗口单独加mainloop # main_root.mainloop()
如果你的场景确实需要单独使用新的Tk()实例,只需做两处调整:
- 给
StringVar显式指定master参数为新创建的root实例 - 在edit函数末尾添加
root.mainloop()启动当前窗口的事件循环
内容的提问来源于stack exchange,提问作者Atif Shaik
相关产品推荐
相关产品推荐

