我是python和kivy的新手,我坚持使用变量实例化的__init__
,我的代码如下:
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
spots={}
class spot(Button):
'''
classdocs
'''
def __init__(self, **kwargs):
'''
Constructor
'''
super(spot,self).__init__(**kwargs)
self.ismine=False
self.text="X"
class game(BoxLayout):
def attachtogrid(self):
self.m.clear_widgets()
spots.clear()
for r in range(0,25):
for c in range(0,25):
id=str(r)+","+str(c)
spots[id]=id
self.m.add_widget(spot(text=id))
我的问题是虽然我将id值传递给text属性(最后一行代码),但我仍然将'X'作为文本,这是spot类中的默认值;如果我删除默认文本 (self.text =“X”)来自ID文本正在运行的类。
请您澄清上述默认值和实例化差异。谢谢。
答案 0 :(得分:2)
当您将值id
传递给键text
时,它将作为一对键:值存储在词典kwargs
内__init__
。
因此,您可以访问 1
kwargs['text']
但是,如果用户没有通过参数text
,则上面的行(尝试访问密钥text
)将引发KeyError
,因为该密钥不存在。要解决此问题,您可以使用dictionary.get(key, default)
方法:
self.text = kwargs.get('text', 'X')
,而不是引发异常,将返回默认值。
1:这是获取与字典中的键对应的值的语法。如果密钥不存在于字典中,则会引发错误。
答案 1 :(得分:1)
def __init__(self, **kwargs): # kwargs is a dict containing text
'''
Constructor
'''
super(spot,self).__init__(**kwargs)
self.ismine=False
self.text=kwargs['text'] # you need to assign it here
答案 2 :(得分:0)
对于Python来说,其他答案在一般意义上是正确的,但它们并不能解释Kivy特别发生的事情。
text
是StringProperty
课程的Button
。这意味着只要您调用超类构造函数,就不需要在构造函数中赋值,因为Kivy会自动处理Kivy properties的赋值。
例如:
In [1]: from kivy.uix.button import Button
In [2]: class TestButton(Button):
...: def __init__(self, **kwargs):
...: super(TestButton, self).__init__(**kwargs)
...:
In [3]: test = TestButton(text='hi')
In [4]: test.text
Out[4]: 'hi'
您也可以使用自己的属性执行此操作:
In [1]: from kivy.uix.widget import Widget
In [2]: from kivy.properties import StringProperty, BooleanProperty, NumericProperty
In [3]: class TestWidget(Widget):
...: name = StringProperty()
...: num = NumericProperty()
...: active = BooleanProperty()
...:
In [4]: test = TestWidget(name='testing', num=12, active=True)
In [5]: test.name, test.num, test.active
Out[5]: ('testing', 12, True)
(当然,请记住,如果没有构造函数,将自动调用超类构造函数。)
有关详细信息,请查看Kivy文档的Properties部分。您可能会发现Events部分也很有用。
如果您自己创建了属性,则可以设置默认值,如下所示:
class TestWidget(Widget):
prop = StringProperty('default text')
对于继承的属性(例如Button
text
):
class TestButton(Button):
def __init__(self, **kwargs):
kwargs.setdefault('text', 'default text')
super(TestButton, self).__init__(**kwargs)