gpt4 book ai didi

kivy - 如何根据 Widget Kivy 属性更新**动态添加的**椭圆(不使用 Builder)的颜色?

转载 作者:行者123 更新时间:2023-12-04 03:58:36 25 4
gpt4 key购买 nike

这与 this other question 非常相关.唯一的区别是我使用 with self.canvas 动态添加椭圆。而不是使用生成器( Builder.load_stringBuilder.load_file )。所以这里是代码确实有效 .当您单击椭圆时,它会移动并更改颜色:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty
from kivy.graphics import Color, Ellipse

Builder.load_string("""
<CircleWidget>:
canvas:
Color:
rgba: self.r,1,1,1
Ellipse:
pos: self.pos
size: self.size
""")

class CircleWidget(Widget):
r = NumericProperty(0)
def __init__(s, **kwargs):
s.size= [50,50]
s.pos = [100,50]
super(CircleWidget, s).__init__(**kwargs)

def on_touch_down(s, touch):
if s.collide_point(touch.x,touch.y):
s.pos = [s.pos[1],s.pos[0]] # this works
s.r = 1.0 # this also works

class TestApp(App):
def build(s):
parent = Widget()
parent.add_widget(CircleWidget())
return parent

if __name__ == '__main__':
TestApp().run()

如果我尝试在不使用 Builder 的情况下做同样的事情,它不再起作用了:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty
from kivy.graphics import Color, Ellipse

class CircleWidget(Widget):
r = NumericProperty(0)
def __init__(s, **kwargs):
s.size= [50,50]
s.pos = [100,50]
super(CircleWidget, s).__init__(**kwargs)
with s.canvas:
Color(s.r,1,1,1)
Ellipse(pos = s.pos, size = s.size)

def on_touch_down(s, touch):
if s.collide_point(touch.x,touch.y):
s.pos = [s.pos[1],s.pos[0]] # This doesn't work anymore
s.r = 1.0 # Neither do this

class TestApp(App):
def build(s):
parent = Widget()
parent.add_widget(CircleWidget())
return parent

if __name__ == '__main__':
TestApp().run()

代码运行并实际调用事件。此外,Widget 被移动(即使它在视觉上不清晰),但 Canvas 的 Instructions 没有更新。

有任何想法吗?

最佳答案

第一个版本有效,因为 kv lang 自动将 Canvas 重新绑定(bind)到表达式中的属性,所以这些行:

    Color:
rgba: self.r,1,1,1

做更多的事情:
    Color(s.r,1,1,1)

但是,您可以做的是绑定(bind) self.r 以自动重建您的 Canvas 指令。

__init__
self.bind(r=self.redraw)
self.bind(pos=self.redraw)
self.bind(size=self.redraw)

并移动
    with s.canvas:
Color(s.r,1,1,1)
Ellipse(pos = s.pos, size = s.size)

属于一个名为 redraw 的方法,之前有一个 self.canvas.clear() 调用。

完整结果:
from kivy.app import App
from kivy.uix.widget import Widget

from kivy.properties import NumericProperty
from kivy.graphics import Color, Ellipse

class CircleWidget(Widget):
r = NumericProperty(0)

def __init__(s, **kwargs):
super(CircleWidget, s).__init__(**kwargs)
s.bind(r=s.redraw)
s.bind(pos=s.redraw)
s.bind(size=s.redraw)
s.size = [50, 50]
s.pos = [100, 50]

def redraw(s, *args):
s.canvas.clear()
with s.canvas:
Color(s.r, 1, 1, 1)
Ellipse(pos = s.pos, size = s.size)

def on_touch_down(s, touch):
if s.collide_point(touch.x, touch.y):
print "gotcha"
s.pos = [s.pos[1], s.pos[0]]
s.r = 1.0

class TestApp(App):
def build(s):
parent = Widget()
parent.add_widget(CircleWidget())
return parent

if __name__ == '__main__':
TestApp().run()

关于kivy - 如何根据 Widget Kivy 属性更新**动态添加的**椭圆(不使用 Builder)的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17058098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com