Tkinter按钮command传参致函数提前执行的解决办法
Tkinter按钮传参避免启动即执行的解决方法
方法1:使用lambda表达式
lambda可以创建匿名函数,把带参数的play函数调用包裹起来,只有按钮被点击时才会执行这个匿名函数,进而触发play逻辑。
修改原代码中设置play_button的command行:
play_button.config(command=lambda: play(title, play_button, exit_button))
完整主文件代码:
import tkinter from play_function import * window = tkinter.Tk() screen_width = window.winfo_screenwidth() screen_height = window.winfo_screenheight() window.config(width=screen_width) window.config(height=screen_height) window.config(background="black") title = tkinter.Label(window, text="Scrabble", background="black", foreground="green", font=("Comic Sans MS", 200)) title.pack() play_button = tkinter.Button(window, text="PLAY", background="blue", foreground="black", font=("Comic Sans MS", 80)) exit_button = tkinter.Button(window, text="EXIT", background="red", foreground="black", font=("Comic Sans MS", 77), command=window.destroy) # 用lambda包裹函数调用,避免启动时执行 play_button.config(command=lambda: play(title, play_button, exit_button)) space = tkinter.Label(foreground="black", background="black", height=2, width=50) play_button.pack() space.pack() exit_button.pack() window.mainloop()
方法2:使用functools.partial
functools.partial能预先绑定函数参数,生成新的可调用对象,直接赋值给command即可实现点击触发。
先导入functools模块,再修改command设置:
import functools play_button.config(command=functools.partial(play, title, play_button, exit_button))
完整主文件代码:
import tkinter import functools from play_function import * window = tkinter.Tk() screen_width = window.winfo_screenwidth() screen_height = window.winfo_screenheight() window.config(width=screen_width) window.config(height=screen_height) window.config(background="black") title = tkinter.Label(window, text="Scrabble", background="black", foreground="green", font=("Comic Sans MS", 200)) title.pack() play_button = tkinter.Button(window, text="PLAY", background="blue", foreground="black", font=("Comic Sans MS", 80)) exit_button = tkinter.Button(window, text="EXIT", background="red", foreground="black", font=("Comic Sans MS", 77), command=window.destroy) # 用partial绑定参数,生成可调用对象 play_button.config(command=functools.partial(play, title, play_button, exit_button)) space = tkinter.Label(foreground="black", background="black", height=2, width=50) play_button.pack() space.pack() exit_button.pack() window.mainloop()
问题原因说明
你原本的写法play_button.config(command=play(title, play_button, exit_button))会在程序启动时立即执行play函数——因为这是直接调用函数并将返回值(此处为None)赋值给command。而Tkinter按钮的command需要的是一个可调用对象(即不带括号的函数本身),只有点击时才会触发执行。
上述两种方法都是将带参数的函数调用包装成可调用对象,彻底避免了启动时的提前执行。
内容的提问来源于stack exchange,提问作者Game Master 2.0
相关产品推荐
相关产品推荐

