是否可以将kwargs传递给Tkinter中的after()函数?

时间:2018-02-28 17:29:13

标签: python tkinter timer

我在谷歌上找不到任何东西,我知道语法是after(delay_ms, callback=None, *args),所以在某种程度上已经知道了答案...但无论如何,我想知道是否有可能将* kwargs传入它,以及如何。我的意思是这样的:

frame.after(1000, button1.pack, side='left', fill='y')

例如,在下面的脚本中,我可以重写它,这样我就不必自己定义respawn函数,只需调用btn.pack中的after()方法即可?

import tkinter as tk


def click(*args):
    btn.pack_forget()
    btn.after(1000, btn_respawn, tk.RIGHT, tk.Y)


def btn_respawn(side, fill):
    btn.pack(side=side, fill=fill)


root = tk.Tk()
frame = tk.Frame(root, width=300, height=100, bg='orange')
btn = tk.Button(frame, text="test button", font=("Consolas", 14))

frame.pack_propagate(0)
frame.pack()
btn.pack(side=tk.LEFT, fill=tk.Y)
btn.bind("<Button-1>", click)

root.mainloop()

3 个答案:

答案 0 :(得分:1)

您可以使用functools.partial

frame.after(1000, functools.update_wrapper(
    functools.partial(btn.pack, side='left', fill='y'), btn.pack))

这实际上为您创建了btn_respawn功能。

请注意,您必须使用update_wrapper将元数据(例如__name__)从原始函数复制到部分。

答案 1 :(得分:0)

您可以使用lambda语句。

frame.after(1000, lambda: button1.pack(side='left', fill='y'))

答案 2 :(得分:0)

您可以将字典作为after()的第三个参数传递,并带有key:value对,其中包含要传递给基础回调函数的关键字参数的名称和值。

DbContext.Database.SetConnectionString("bla bla");