Python-将2组**KWARG传递到同一个类中。可能吗?

Python-将2组**KWARG传递到同一个类中。可能吗?,python,tkinter,Python,Tkinter,假设我有一个名为NewEntry的类,它有两个tkinter小部件ttk.Entry和ttk.Button,我想分别传递它们**kw_ent和**kw_,但分别用于Entry和Button小部件,以便在使用此类时实现代码灵活性 但是,如下面的代码所示,定义2 KWARG会产生语法错误,这种错误在以这种方式编码时非常明显 有没有办法通过2 kwargs class NewEntry(ttk.Frame): def __init__(self, master=None, **kw_ent,

假设我有一个名为NewEntry的类,它有两个tkinter小部件ttk.Entry和ttk.Button,我想分别传递它们**kw_ent和**kw_,但分别用于Entry和Button小部件,以便在使用此类时实现代码灵活性

但是,如下面的代码所示,定义2 KWARG会产生语法错误,这种错误在以这种方式编码时非常明显

有没有办法通过2 kwargs

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 kwargs

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()
是的,非常简单:不要使用**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=NewEntryroot,width=13中,width应该是kw_ent的一部分,您需要:

a = NewEntry(root, kw_ent={"width":13})

作为一个旁注,你可能想考虑一个比ETER更可读的命名方案,但是-Inter和Butin出现在脑海里…简短并不意味着晦涩和3个字母的标识符不会使代码更快,但它们确实会降低代码的可读性

有没有办法通过2 kwargs

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()
是的,非常简单:不要使用**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=NewEntryroot,width=13中,width应该是kw_ent的一部分,您需要:

a = NewEntry(root, kw_ent={"width":13})

作为一个旁注,你可能想考虑一个比ETER更可读的命名方案,但是-Inter和Butin出现在脑海里…简短并不意味着晦涩和3个字母的标识符不会使代码更快,但它们确实会降低代码的可读性。

python如何确定哪些关键字参数属于**kw\ent,哪些属于**kw\u但是?只需将两个单独的dict对象作为普通参数传递:kw_ent,kw_but.as write-我知道这不是解决问题的方法,从这个特殊的原因你可以。首先用另一个dict更新一个dict,然后将其传递到函数调用中。对。所以我不确定你的问题是什么。我的意思是,如果你只是使参数正常,位置参数,并确保通过单独的dict对象,你的代码将工作。。。。伙计,我已经解释过了,你不能这么做,Python函数签名不支持这个。另外,**kwargs不允许您给他们默认值。在我看来,最好的解决方案是只使用两个单独的普通参数,并将它们作为dict对象传递,这样就可以只定义所需的参数。这就是您需要更改的全部内容,您的代码将按照编写的方式工作。python如何决定哪些关键字参数属于**kw\u ent,哪些属于**kw\u but?只需将两个单独的dict对象作为普通参数传递:kw_ent,kw_but.as write-我知道这不是解决问题的方法,从这个特殊的原因你可以。首先用另一个dict更新一个dict,然后将其传递到函数调用中。对。所以我不确定你的问题是什么。我的意思是,如果你只是使参数正常,位置参数,并确保通过单独的dict对象,你的代码将工作。。。。伙计,我已经解释过了,你不能这么做,Python函数签名不支持这个。另外,**kwargs不允许您给他们默认值。在我看来,最好的解决方案是只使用两个单独的普通参数,并将它们作为dict对象传递,这样就可以只定义所需的参数。这就是您需要更改的全部内容,您的代码将按照您之前编写的方式工作。1重新分级符号-这只是一个示例,不是真正代码的一部分,只是为了说明我的观点,仍然感谢您。正如其他评论中所建议的,我理解这是解决问题的方法,谢谢。1重新分级符号-这只是一个示例,不是真正代码的一部分,只是为了说明我的观点,仍然感谢您。2正如其他评论中所建议的,我理解这是解决问题的方法