如何创建一个填充父级的* args和** kwargs的子类?

问题描述

我试图在tkinter中创建一个按钮子类,以便它自动填充一些args和kwargs。我不确定是python问题还是tkinter问题。

from tkinter import *

root = Tk()

class MyButton(Button):
    def __init__(self,*args,**kwargs):
        super(Button).__init__(*args,**kwargs)

    kwargs = {"padx": 40,"pady": 20}
    args = (root)


test = Numbutton(text = "48")

test.pack()

root.mainloop()

错误是:

Traceback (most recent call last):
  File "my file directory",line 18,in <module>
    test = Numbutton(text = "xyz",**kwargs)
  File "my tkinter directory",line 1489,in cget
    return self.tk.call(self._w,'cget','-' + key)
TypeError: can only concatenate str (not "int") to str

感谢您的帮助:)

解决方法

这是第一个刺路:

from tkinter import *

root = Tk()

class MyButton(Button):
    def __init__(self,*args,**kwargs):
        super().__init__(root,padx=40,pady=20,**kwargs)

test = MyButton(text = "48")
test.pack()
root.mainloop()

编辑:

这是一种更好的方法,可用于使用初始kwargs代替硬编码初始kwargs来生成子类:

from tkinter import Tk,Button


def set_button_initial(*initial_args,**initial_kwargs):
    class ButtonClassWithInitialStuff(Button):
        def __init__(self,**kwargs):
            super().__init__(*initial_args,**initial_kwargs,**kwargs)
    return ButtonClassWithInitialStuff


root = Tk()

ButtonClass1 = set_button_initial(root,{"padx": 40,"pady": 20})
ButtonClass2 = set_button_initial(root,{"padx": 10,"pady": 50})

ButtonObject1a = ButtonClass1(text="48")
ButtonObject1b = ButtonClass1(text="49")
ButtonObject2 = ButtonClass2(text='second')
ButtonObject1c = ButtonClass1(text="50")

ButtonObject1a.pack()
ButtonObject1b.pack()
ButtonObject2.pack()
ButtonObject1c.pack()

root.mainloop()

注意,对于函数set_button_initial,我们返回类ButtonClassWithInitialStuff而不是对象ButtonClassWithInitialStuff(),即,我们设置了构造函数(init),但尚未使用它。

使用该函数,我们创建了ButtonClass1和ButtonClass2类。

然后,我们实例化刚刚创建的类的ButtonObject1a-c和ButtonObject1。注意:我们可以重用这些类以创建所需的任意数量的对象,而无需调用set_button_initial

(编辑以解释评论者提出的问题)

据我所知@MisterMiyagi建议使用

from functools import partial

def set_button_initial(*initial_args,**initial_kwargs):
    return partial(Button,*initial_args,**initial_kwargs)

表现相同,但外观更好,不会丢失任何信息,因此效果更好