可以说我有一个名为NewEntry
的类,带有2个tkinter窗口小部件ttk.Entry
和ttk.Button
,我想分别将其中的**kw_ent
和**kw_but
分别传递给Entry和Button窗口小部件,以启用代码使用此类时的灵活性。
但是,如下面的代码所示,定义2个kwarg会产生语法错误(以这种方式编码时很明显)。
有办法通过2个kwarg吗?
class NewEntry(ttk.Frame):
def __init__(self, master=None, **kw_ent, **kw_but):
ttk.Frame.__init__(self, master)
self.master = master
self.ent_var = tk.StringVar()
self.ent = ttk.Entry(self, textvariable=self.ent_var, **kw_ent)
self.ent.grid(row=0, column=0)
self.button = ttk.Button(self, text='Button', command=self.but_callback, **kw_but)
self.button.grid(row=0, column=1)
self.ent.bind('<FocusIn>', self.clear_ent)
self.init_vals()
def init_vals(self):
self.ent_var.set("Enter value")
self.ent['foreground'] = 'red'
def clear_ent(self, event):
self.ent_var.set('')
self.ent['foreground'] = '#4c4c4c'
def restore_ent(self, event):
self.init_vals()
def but_callback(self):
print(self.ent_var.get())
sleep(1)
self.init_vals()
root = tk.Tk()
a = NewEntry(root, width=13)
a.grid()
root.mainloop()
最佳答案
有办法通过2个kwarg吗?
是的,很简单:不要使用**kwargs
表示法。
class NewEntry(ttk.Frame):
def __init__(self, master=None, kw_ent=None, kw_but=None):
if kw_ent is None:
kw_ent = {}
if kw_but is None:
kw_but = {}
# your existsing code here
实例化
NewEntry
时,您当然必须更加明确-假设在a = NewEntry(root, width=13)
中,width
应该是kw_ent
的一部分,您需要:a = NewEntry(root, kw_ent={"width":13})
附带说明一下,您可能想考虑一种比“ ent”或“ but”更具可读性的命名方案-想到“ entry”和“ button” ...简短并不意味着隐秘,而3个字母的标识符不会使您的代码更快(但他们肯定会降低其可读性)。