Python 动态更改矩形颜色
在下面的示例中,在FloatLayout的画布中绘制了两个矩形 目标是创建一个简单的像素艺术绘图应用程序,用户可以在其中绘制矩形并更改其颜色(例如鼠标下矩形的颜色),因此我无法在kv文件中创建这些矩形 所以在这个演示示例中,我只想更改鼠标下矩形的颜色Python 动态更改矩形颜色,python,kivy,Python,Kivy,在下面的示例中,在FloatLayout的画布中绘制了两个矩形 目标是创建一个简单的像素艺术绘图应用程序,用户可以在其中绘制矩形并更改其颜色(例如鼠标下矩形的颜色),因此我无法在kv文件中创建这些矩形 所以在这个演示示例中,我只想更改鼠标下矩形的颜色 from kivy.app import App from kivy.lang import Builder from kivy.properties import ListProperty from kivy.graphics import Co
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.graphics import Color, Rectangle
KV = """
FloatLayout
size_hint: None, None
size: 512, 512
on_touch_down: app.test(*args[1].pos)
"""
class MyApp(App):
color = ListProperty((1,1,1,1))
def build(self):
self.root = Builder.load_string(KV)
self.init_rects()
def init_rects(self):
with self.root.canvas:
x,y = self.root.pos
w,h = self.root.size
Color(rgba=(1,1,1,1))
self.r1 = Rectangle(pos = (x,y), size= (w/2,h))
Color(rgba=(1,0,0,1))
self.r2 = Rectangle(pos = (w/2,y), size= (w/2,h))
def test(self, x,y):
if x< self.root.center_x:
print ('I need to color this rectangle (self.r1) to red')
else:
print ('I need to color this rectangle (self.r2) to white')
MyApp().run()
从kivy.app导入应用
从kivy.lang导入生成器
从kivy.properties导入ListProperty
从kivy.graphics导入颜色,矩形
KV=”“”
浮动布局
大小提示:无,无
尺码:512
在触摸屏上:app.test(*args[1].pos)
"""
类别MyApp(应用程序):
颜色=ListProperty((1,1,1,1))
def生成(自):
self.root=Builder.load\u串(KV)
self.init_rects()
定义初始化(自):
使用self.root.canvas:
x、 y=self.root.pos
w、 h=自根大小
颜色(rgba=(1,1,1,1))
self.r1=矩形(位置=(x,y),大小=(w/2,h))
颜色(rgba=(1,0,0,1))
self.r2=矩形(位置=(w/2,y),尺寸=(w/2,h))
def测试(自身、x、y):
如果x
在本例中,我将矩形存储为self.r1和self.r2(因为我认为需要进一步更改它们的位置或大小)
问题是我没有找到一个只改变一个矩形颜色而不改变其他颜色的例子
我有一个愚蠢的解决方案(如下)——每次都要创建一个新的矩形。但我确信,当有很多矩形时,这是一个糟糕的解决方案
def test(self, touch_x, touch_y):
with self.root.canvas:
x,y = self.root.pos
w,h = self.root.size
if touch_x< self.root.center_x:
Color(rgba=(1,0,0,1))
self.r1 = Rectangle(pos = (x,y), size= (w/2,h))
else:
Color(rgba=(1,1,1,1))
self.r2 = Rectangle(pos = (w/2,y), size= (w/2,h))
def测试(自身、触摸x、触摸y):
使用self.root.canvas:
x、 y=self.root.pos
w、 h=自根大小
如果触摸_x
粗略地说,我忽略了类似于Rectangle(rgba=…)
这种情况下的解决方案是什么?您可以更改
颜色,而不是尝试更改矩形。下面是对代码的修改,演示了以下内容:
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.graphics import Color, Rectangle
KV = """
FloatLayout
size_hint: None, None
size: 512, 512
on_touch_down: app.test(*args[1].pos)
"""
class MyApp(App):
color = ListProperty((1,1,1,1))
def build(self):
self.root = Builder.load_string(KV)
self.init_rects()
def init_rects(self):
with self.root.canvas:
x,y = self.root.pos
w,h = self.root.size
self.c1 = Color(rgba=(1,1,1,1))
Rectangle(pos = (x,y), size= (w/2,h))
self.c2 = Color(rgba=(1,0,0,1))
Rectangle(pos = (w/2,y), size= (w/2,h))
def test(self, x,y):
if x< self.root.center_x:
print ('I need to color this rectangle (self.r1) to red')
self.c1.rgba = (1,0,0,1)
else:
print ('I need to color this rectangle (self.r2) to white')
self.c2.rgba = (1,1,1,1)
MyApp().run()
从kivy.app导入应用
从kivy.lang导入生成器
从kivy.properties导入ListProperty
从kivy.graphics导入颜色,矩形
KV=”“”
浮动布局
大小提示:无,无
尺码:512
在触摸屏上:app.test(*args[1].pos)
"""
类别MyApp(应用程序):
颜色=ListProperty((1,1,1,1))
def生成(自):
self.root=Builder.load\u串(KV)
self.init_rects()
定义初始化(自):
使用self.root.canvas:
x、 y=self.root.pos
w、 h=自根大小
self.c1=颜色(rgba=(1,1,1))
矩形(位置=(x,y),尺寸=(w/2,h))
self.c2=颜色(rgba=(1,0,0,1))
矩形(位置=(w/2,y),尺寸=(w/2,h))
def测试(自身、x、y):
如果x
有趣的项目,巧合的是,这与我在Kivy学习时做的第一个项目几乎相同:)我做的方法是创建一个网格布局,用一吨没有背景的按钮填充它(你的按钮。background\u normal=“
),并设置按钮的on\u release
方法来设置按钮的颜色(您的按钮。背景颜色=(1,0,0,1)
)。让我知道这是否有帮助,或者你是否需要一个更具体的例子。@Erik我对性能有疑问。在这种情况下,如果你有很多小部件(单元格),例如,几千个小部件),那么速度较慢的部分加载了所有小部件,但它们都对鼠标事件做出了响应。我想我升级到了一个128x128的网格(~16000个小部件),大概需要10秒钟才能加载。很不错,但我记不清确切的数字了。不过你是对的,如果你想让其他人使用它,肯定有更好的方法。.export\u to\u png
功能也很方便,可以保存图形,以防您还没有遇到这种情况。