Tkinter StringVar无法打印:移除函数括号的修复原理疑问
Tkinter按钮command参数的问题解析
你把command=button_func()改成command=button_func的做法完全正确,核心原因在于Python中函数的调用逻辑:
错误写法的问题
当你写command=button_func()时,函数名后加的括号会让Python立即执行这个函数——也就是说,在你创建按钮的那一刻,button_func()就已经跑了一遍(你启动程序时应该会看到控制台打印了空字符串),而按钮的command参数实际接收的是这个函数的返回值(因为你的函数没有return语句,所以返回None)。等你点击按钮时,Tkinter尝试调用None,自然不会有任何反应。
正确写法的原理
写成command=button_func时,你传递给按钮的是函数对象本身,而不是函数执行的结果。Tkinter会把这个函数保存起来,只有当你点击按钮的瞬间,才会去调用这个函数,这时候print(string_var.get())才会读取输入框的内容并打印,完全符合你的预期。
扩展:给按钮函数传参
如果你的按钮函数需要接收参数,不能直接写command=func(arg)(同样会立即执行),可以用lambda匿名函数包裹:
def button_func_with_arg(arg): print(arg, string_var.get()) # 用lambda包裹,点击时才执行函数调用 button = ttk.Button(master=window, text='button', command=lambda: button_func_with_arg("输入内容:"))
修正后的完整代码
import tkinter as tk from tkinter import ttk def button_func(): print(string_var.get()) # window window = tk.Tk() window.title('Tkinter Variables') # tkinter variable string_var = tk.StringVar() # widgets label = ttk.Label(master=window, text='label', textvariable=string_var) label.pack() entry = ttk.Entry(master=window, textvariable=string_var) entry.pack() # 修正:去掉函数后的括号 button = ttk.Button(master=window, text='button', command=button_func) button.pack() # run window.mainloop()
内容的提问来源于stack exchange,提问作者Inky
相关产品推荐
相关产品推荐

