Kivy在按下时更改自定义按钮的颜色

3

毋庸置疑,我是kivy的新手,正在尝试使用三角形按钮编写简单的GUI(我希望它们看起来很不错,而不仅仅是仍然可以被点击的正方形画布)。因此,我找到了这个很棒的代码,可以制作三角形并获取可点击区域。

基本上,我只想在按下时更改颜色(并在松开时恢复原样),但我太菜了,不知道怎么实现。

import kivy
from kivy.uix.behaviors.button import ButtonBehavior
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import ListProperty
from kivy.vector import Vector
from kivy.lang import Builder

Builder.load_string('''
<TriangleButton>:
    id: trianglething
    # example for doing a triangle
    # this will automatically recalculate pX from pos/size
    #p1: 0, 0
    #p2: self.width, 0
    #p3: self.width / 2, self.height
    # If you use a Widget instead of Scatter as base class, you need that:
    p1: self.pos
    p2: self.right, self.y
    p3: self.center_x, self.top

    # draw something
    canvas:
        Color:
            rgba: self.triangle_down_color
        Triangle:
            points: self.p1 + self.p2 + self.p3
''')

def point_inside_polygon(x, y, poly):
    '''Taken from http://www.ariel.com.au/a/python-point-int-poly.html
    '''
    n = len(poly)
    inside = False
    p1x = poly[0]
    p1y = poly[1]
    for i in range(0, n + 2, 2):
        p2x = poly[i % n]
        p2y = poly[(i + 1) % n]
        if y > min(p1y, p2y):
            if y <= max(p1y, p2y):
                if x <= max(p1x, p2x):
                    if p1y != p2y:
                        xinters = (y - p1y) * (p2x - p1x) / (p2y - p1y) + p1x
                    if p1x == p2x or x <= xinters:
                        inside = not inside
        p1x, p1y = p2x, p2y
    return inside

class TriangleButton(ButtonBehavior, Widget):
    triangle_down_color = ListProperty([1,1,1,1])
    p1 = ListProperty([0, 0])
    p2 = ListProperty([0, 0])
    p3 = ListProperty([0, 0])

    def changecolor(self, *args):
        print "color"
        self.ids.trianglething.canvas.triangle_down_color = (1,0,1,1)

    def collide_point(self, x, y):
        x, y = self.to_local(x, y)
        return point_inside_polygon(x, y,
                self.p1 + self.p2 + self.p3)  

if __name__ == '__main__':
    from kivy.base import runTouchApp

    runTouchApp(TriangleButton(on_press=TriangleButton.changecolor,size_hint=(None,None)))

我在想,可能是这一行写错了:

self.ids.trianglething.canvas.triangle_down_color = (1,0,1,1)

但我真的不太清楚。任何帮助将不胜感激。
1个回答

1
你已经在小部件中了,直接使用它,不要通过 idsIds 是用于在kv语言中设置小部件子元素的属性 id,例如,如果你的TriangleButton有一个名为Image的子元素,并且有一个id:myimage,你可以通过这个来获取它:
self.ids.myimage

因此,只需删除不必要的内容即可:
self.triangle_down_color = (1,0,1,1)

如果打印一些对象,或者那个东西根本不存在,打印实际要查找的内容也很好。绑定比手动将某些内容放入on_press更好:)

t = TriangleButton()
t.bind(on_press=function)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接