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

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

相关产品推荐
方舟 Agent Plan

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

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