Объект ListProperty не является итеративным kivy

#python #kivy

Вопрос:

вот мой код

 from kivy.app import App from kivy.uix.gridlayout import GridLayout from kivy.uix.image import Image from kivy.uix.relativelayout import RelativeLayout from pieces.whitepawn import WhitePawn from kivy.properties import ListProperty  class CubeWidget(RelativeLayout):  def __init__(self,color,id,piece,**kwargs):  self.id=id  self.piece=piece  self.color=ListProperty(color)  super(CubeWidget,self).__init__(**kwargs)   if self.piece:  self.img=Image(source=self.piece.source)  self.add_widget(self.img)   def on_touch_down(self, touch):  if self.collide_point(touch.x,touch.y):  self.color=[1,1,0,1]  return super().on_touch_down(touch)  

связанный файл .kv

 lt;CubeWidgetgt;:  canvas:  Color:  rgba:root.color    Rectangle:  size:root.size    lt;New_Boardgt;:  rows:8  cols:8  

Итак, в основном я хочу, чтобы при нажатии мыши(on_touch_down) цвет виджета менялся.я не понимаю, почему он всегда говорит

Объект ListProperty не может быть повторен

для этой строки

 rgba:root.color          

Ответ №1:

Это Properties должно быть определено вне любого метода (плохо документировано, но верно). Так что ваш color должен быть определен следующим образом:

 class CubeWidget(RelativeLayout):  # define Properties here  color = ListProperty([1, 1, 1, 1])   def __init__(self, color, id, piece, **kwargs):  self.id=id  self.piece=piece  self.color=color # set Property value  super(CubeWidget,self).__init__(**kwargs)  if self.piece:  self.img=Image(source=self.piece.source)  self.add_widget(self.img)   def on_touch_down(self, touch):  if self.collide_point(touch.x,touch.y):  self.color=[1,1,0,1]  return super().on_touch_down(touch)