#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)