Tkinter中打印Entry赋值的变量返回.!entry而非输入值的问题
核心问题成因
你现在打印输出为.!entry,本质是把Entry组件实例对象本身当成了存用户输入文本的变量,二者完全不是一回事:
- 你在
initial_user_name_set里用global声明的全局变量user_name,实际指向的是Entry(root)创建出来的组件对象,不是输入框里的文字内容。 .!entry是Tkinter内部给所有自动创建的组件分配的默认路径标识,直接打印组件对象时,就会输出这个内部标识,和用户输入的内容没有任何关系。- 你之前能正常生成问候Label,是因为调用了
user_name.get()——这是Entry组件自带的方法,只有调用这个方法,才会返回输入框里存储的实际文本。你在time_based_greeting里写的user_name.get()没有把返回值赋值给任何变量,属于执行了但没接住结果的无效代码。
代码修正方法
按照下面的逻辑调整,就能拿到正常的输入文本:
- 单独定义一个全局变量专门存用户输入的名字文本,不要和Entry组件对象用同一个变量名,避免类型混淆:
def initial_user_name_set(): global user_name_entry, user_name_text initial_greeting_label() # Entry组件单独存为entry类的变量 user_name_entry = Entry(root) user_name_entry.pack() user_name_enter_button() - 在触发问候的函数里,把
.get()拿到的文本赋值给专门存文本的全局变量,替换掉之前空调用的写法:def time_based_greeting(): global user_name_entry, user_name_text # 把get()返回的文本存到全局变量里 user_name_text = user_name_entry.get().strip() if currentTime.hour < 12: morning_greeting_label() elif 12 <= currentTime.hour < 18: afternoon_greeting_label() else: evening_greeting_label() # 这时候打印存文本的变量,就会输出实际输入的内容 print(user_name_text) - 生成问候Label时直接使用存好的文本变量即可:
def evening_greeting_label(): global user_name_text evening_greeting = Label(root, text="Good evening, " + user_name_text + ".") evening_greeting.pack()
额外避坑提示
- 组件对象和其内部存储的内容一定要分开命名,不然很容易像现在这样,把对象本身当文本打印,出现不符合预期的输出。
- 调用Entry的
.get()、.insert()这类方法时,要明确返回值/参数的实际类型,不要默认直接把组件对象当成字符串用。
内容的提问来源于stack exchange,提问作者user15039090
相关产品推荐
相关产品推荐

