问题描述
我试图在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)
表现相同,但外观更好,不会丢失任何信息,因此效果更好