Python 如何创建一个子类来填充父对象的*args和**kwargs?
我试图在tkinter中创建一个button子类,以便它自动填充一些arg和kwarg。我不确定这是python问题还是tkinter问题Python 如何创建一个子类来填充父对象的*args和**kwargs?,python,tkinter,subclass,args,keyword-argument,Python,Tkinter,Subclass,Args,Keyword Argument,我试图在tkinter中创建一个button子类,以便它自动填充一些arg和kwarg。我不确定这是python问题还是tkinter问题 从tkinter导入* root=Tk() 类MyButton(按钮): 定义初始化(self,*args,**kwargs): 超级(按钮)。\uuuuuuuuuuuuuuuuuuuu初始(*参数,**kwargs) kwargs={“padx”:40,“pady”:20} args=(根) 测试=数字按钮(text=“48”) test.pack() r
从tkinter导入*
root=Tk()
类MyButton(按钮):
定义初始化(self,*args,**kwargs):
超级(按钮)。\uuuuuuuuuuuuuuuuuuuu初始(*参数,**kwargs)
kwargs={“padx”:40,“pady”:20}
args=(根)
测试=数字按钮(text=“48”)
test.pack()
root.mainloop()
错误是:
回溯(最近一次呼叫最后一次):
文件“我的文件目录”,第18行,在
test=Numbutton(text=“xyz”、*args、**kwargs)
cget中的文件“my tkinter目录”,第1489行
返回self.tk.call(self._w,'cget','-'+键)
TypeError:只能将str(而不是“int”)连接到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, *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,我们返回类ButtonClassWithInitialStuff,而不是对象ButtonClassWithInitialStuff(),也就是说,我们设置了构造函数(init),但还没有使用它
使用该函数,我们创建了ButtonClass1和ButtonClass2类
然后,我们实例化刚刚创建的类的obejcts ButtonObject1a-c和ButtonObject1。注意:我们可以重用这些类来创建任意多的对象,而无需重新调用set_button_initial
(编辑以解释评论者提出的问题)
据我所知@mistermiagi建议使用
from functools import partial
def set_button_initial(*initial_args, **initial_kwargs):
return partial(Button, *initial_args, **initial_kwargs)
它的行为似乎相同,但外观更好,不会丢失信息,因此更好您的代码显示
test=Numbutton(text=“48”)
,但您的错误显示test=Numbutton(text=“xyz”、*args、**kwargs)
。代码中的任何地方都没有定义Numbutton
。请提供一个。与其在每次调用时创建和返回一个新类,set_button_initial
可以返回部分(button,*initial_args,**initial_kwargs)
。我不明白为什么你的“better”方法实际上更好。“better”方法接受初始kwargs而不是硬编码,因此,您可以使用单个函数传递不同的KWARG来定义多个不同的预加载类