如何创建一个子类来填充父类的 *args 和 **kwargs?
How to make a subclass that fills *args and **kwargs of the parent?
我正在尝试在 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", *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
感谢任何帮助:)
这是第一次尝试:
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 来制作子class:
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()
注意,对于函数 set_button_initial 我们 return 使用 class ButtonClassWithInitialStuff 而不是对象 ButtonClassWithInitialStuff(),也就是说,我们设置了构造函数 (init),但我们不还没用呢
使用该函数,我们创建 classes ButtonClass1 和 ButtonClass2。
然后,我们实例化刚刚创建的 classes 的对象 ButtonObject1a-c 和 ButtonObject1。注意:我们可以重复使用 classes 来制作我们想要的任意数量的对象,而无需 re-calling set_button_initial
(编辑以解释评论者提出的问题)
据我所知@MisterMiyagi 建议使用
from functools import partial
def set_button_initial(*initial_args, **initial_kwargs):
return partial(Button, *initial_args, **initial_kwargs)
这看起来表现相同,但是 nicer-looking 没有丢失信息,因此更好
我正在尝试在 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", *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
感谢任何帮助:)
这是第一次尝试:
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 来制作子class:
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()
注意,对于函数 set_button_initial 我们 return 使用 class ButtonClassWithInitialStuff 而不是对象 ButtonClassWithInitialStuff(),也就是说,我们设置了构造函数 (init),但我们不还没用呢
使用该函数,我们创建 classes ButtonClass1 和 ButtonClass2。
然后,我们实例化刚刚创建的 classes 的对象 ButtonObject1a-c 和 ButtonObject1。注意:我们可以重复使用 classes 来制作我们想要的任意数量的对象,而无需 re-calling set_button_initial
(编辑以解释评论者提出的问题)
据我所知@MisterMiyagi 建议使用
from functools import partial
def set_button_initial(*initial_args, **initial_kwargs):
return partial(Button, *initial_args, **initial_kwargs)
这看起来表现相同,但是 nicer-looking 没有丢失信息,因此更好