为何在两个Python3脚本间传递tkinter Entry值时得到'!entry'而非实际值?
跨脚本传递tkinter Entry取值返回
!entry问题排查 复现代码
- 主运行脚本:
from tkinter import * w=Tk() def send(e): import snd e=Entry(w) e.pack() b=Button(w,command=lambda:send(e.get())) b.pack() w.mainloop()
- 同目录下snd.py脚本:
from __main__ import * print(e)
问题根因
- 按钮回调中虽然调用了
e.get()拿到输入框实际值,也把值传给了send函数,但send函数接收参数后没有做任何传递处理,直接导入snd模块 - snd模块里
from __main__ import *导入的是主程序命名空间下的Entry组件对象本身,不是get()返回的输入字符串 - tkinter组件默认的字符串转换结果是Tk内部为组件分配的路径标识,你创建的第一个Entry组件的默认标识就是
!entry,所以打印时输出的是这个内部标识,而非用户输入内容 - 额外隐藏问题:Python模块导入有缓存机制,第一次点击按钮导入snd后,后续点击不会重新执行snd中的打印逻辑
正确写法
不要用from __main__ import *的方式跨脚本隐式共享变量,显式传递参数即可:
- 修改后主脚本:
from tkinter import * w=Tk() def send(input_value): import snd # 显式将输入值传给snd模块的处理函数 snd.process_input(input_value) e=Entry(w) e.pack() b=Button(w,command=lambda:send(e.get())) b.pack() w.mainloop()
- 修改后snd.py:
def process_input(val): # 此处val即为用户在输入框中填写的实际内容 print("获取到的输入内容:", val)
注意:如果业务逻辑确实需要在其他脚本中访问Entry组件对象,也请通过函数参数显式传递,避免隐式导入带来的命名空间污染、导入时序报错等问题。
内容的提问来源于stack exchange,提问作者Tommy
相关产品推荐
相关产品推荐

