如何获取tkinter Button组件command绑定函数的返回值
核心问题原因
- tkinter的
Button的command回调函数的返回值会被框架直接丢弃,本身就无法通过直接赋值的方式拿到返回值 - 代码执行逻辑存在时序问题:你原代码里的
print(value)和display函数的返回都在root.mainloop()启动之前完成,此时用户还没有触发按钮点击事件,自然拿不到输入内容 - lambda中写的
value == button(e,f)是相等判断表达式,不是赋值操作,就算触发点击也不会修改外层的value变量 - 之前用全局变量只有关闭窗口才能拿到值,是因为
root.mainloop()会阻塞主线程,直到窗口被关闭才会继续执行之后的代码,如果你把打印逻辑写在mainloop()之后,就只能等窗口关闭才能执行
常用解决方案
方案1:使用可变对象存储值(无需全局变量)
可以用列表、字典这类可变对象存储值,可变对象传引用,在回调中修改不需要声明global,示例代码:
import tkinter as tk def button(e,f, value_container): value_container[0] = e.get() f.destroy() # 拿到值之后如果需要立即处理,可以直接在这里调用处理逻辑 print("点击后拿到的值:", value_container[0]) def display(root, value_container): f = tk.Frame(root,width=200 ,height=200) f.place(x=0,y=0) e = tk.Entry(f,width=20,font=17) e.place(x=0,y=0) b = tk.Button(f,text="submit",command = lambda : button(e,f, value_container)) b.place(x=0,y=40) root = tk.Tk() root.geometry("200x200") # 用列表作为可变容器,第一个元素存输入值 value_container = [''] display(root, value_container) root.mainloop() # 窗口关闭后也可以在这里拿到最终值 print("窗口关闭后拿到的值:", value_container[0])
方案2:使用tkinter内置变量类
tkinter提供了StringVar、IntVar这类专门的变量对象,本身就是可变的,还可以绑定组件自动同步值:
import tkinter as tk def button(e,f, value_var): value_var.set(e.get()) f.destroy() print("点击后拿到的值:", value_var.get()) def display(root, value_var): f = tk.Frame(root,width=200 ,height=200) f.place(x=0,y=0) e = tk.Entry(f,width=20,font=17) e.place(x=0,y=0) b = tk.Button(f,text="submit",command = lambda : button(e,f, value_var)) b.place(x=0,y=40) root = tk.Tk() root.geometry("200x200") value_var = tk.StringVar(value='') display(root, value_var) root.mainloop() print("窗口关闭后拿到的值:", value_var.get())
方案3:将处理逻辑直接嵌入回调(最符合事件驱动设计)
GUI程序是事件驱动的,不需要在主线程同步等待返回值,你需要用输入值执行的逻辑,直接放到按钮点击的回调里执行即可,不需要额外存储变量传递:
import tkinter as tk # 处理输入值的逻辑 def process_input(input_val): print("处理输入内容:", input_val) # 这里写你拿到值之后要执行的所有逻辑 def button(e,f): value = e.get() f.destroy() # 直接调用处理逻辑 process_input(value) def display(root): f = tk.Frame(root,width=200 ,height=200) f.place(x=0,y=0) e = tk.Entry(f,width=20,font=17) e.place(x=0,y=0) b = tk.Button(f,text="submit",command = lambda : button(e,f)) b.place(x=0,y=40) root = tk.Tk() root.geometry("200x200") display(root) root.mainloop()
内容的提问来源于stack exchange,提问作者Bind
相关产品推荐
相关产品推荐

