简体   繁体   English

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

[英]How to make a subclass that fills *args and **kwargs of the parent?

I am trying to make a button subclass in tkinter so that it fills some of the args and kwargs automatically.我正在尝试在 tkinter 中创建一个按钮子类,以便它自动填充一些 args 和 kwargs。 I am not sure if it is a python issue or a tkinter issue.我不确定这是 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()

And the error is:错误是:

Traceback (most recent call last):
  File "my file directory", line 18, in <module>
    test = Numbutton(text = "xyz", *args, **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

Any help is appreciated :)任何帮助表示赞赏:)

Here's a first stab:这是第一刺:

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()

EDIT:编辑:

here's a better way that can be used to used to make a subclass using the initial kwargs instead of hard coding initial kwargs:这是一种更好的方法,可用于使用初始 kwargs 而不是硬编码初始 kwargs 来创建子类:

from tkinter import Tk, Button


def set_button_initial(*initial_args, **initial_kwargs):
    class ButtonClassWithInitialStuff(Button):
        def __init__(self, *args, **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()

Note, for the function set_button_initial we return the class ButtonClassWithInitialStuffinstead of an object ButtonClassWithInitialStuff(), that is, we set up the constructor (init), but we don't use it yet.注意,对于函数 set_button_initial,我们返回的是类 ButtonClassWithInitialStuff,而不是对象 ButtonClassWithInitialStuff(),即我们设置了构造函数(init),但我们还没有使用它。

Using the function, we create classes ButtonClass1 and ButtonClass2.使用该函数,我们创建了 ButtonClass1 和 ButtonClass2 类。

Then, we instantiate obejcts ButtonObject1a-c and ButtonObject1 of our classes we just created.然后,我们实例化我们刚刚创建的类的对象 ButtonObject1a-c 和 ButtonObject1。 Note: we can reuse the classes to make as many objects as we want without re-calling set_button_initial注意:我们可以重用这些类来创建任意数量的对象,而无需重新调用 set_button_initial

(edited to explain questions raised by commentors) (编辑以解释评论者提出的问题)

As far as I can see @MisterMiyagi suggests to use据我所知@MisterMiyagi 建议使用

from functools import partial

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

which appears to behave identically, but is nicer-looking without losing information, and is therefore better它看起来表现相同,但在不丢失信息的情况下看起来更好看,因此更好

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM