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)

但是我真的不知道。如有任何帮助,不胜感激

您已经在小部件中,直接进入它,而不是通过idsIds是属性id设置在一个小部件的孩子在kv语言,例如,如果你的TriangleButton有一个id: myimage的孩子Image,你会得到它这样:

self.ids.myimage

因此,删除不必要的东西就足够了:

self.triangle_down_color = (1,0,1,1)

如果打印的是某个对象,或者这个对象根本不存在,那么打印出你真正要找的东西也是很好的。绑定比手动将内容放入on_press要好:)

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

最新更新