2016-10-16 83 views
3

不用說,我是新的kivy,試圖用三角按鈕編寫一個簡單的GUI(我希望它們是體面的,而不僅僅是仍然是方形畫布的圖像點擊三角形部分)。所以我找到了這個偉大的代碼,使三角形和獲得可點擊區域。Kivy改變了新聞上的自定義按鈕的顏色

基本上我只是想讓它在按下時改變顏色(並在未按下時恢復原狀)並且我太新鮮以至於無法工作。

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

你已經在小部件,直接去它,而不是通過idsIds適用於以kv語言設置在小部件的孩子中的財產id,例如如果您TriangleButton有一個孩子Imageid: myimage,你會用此得到它:

self.ids.myimage 

因此在去除不需要的東西就足夠了:

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

這也是不錯打印你究竟是什麼尋找 - 如果它打印一些對象,或者如果它甚至不存在。和綁定是比手動將東西放入on_press :)

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

完美,謝謝! – Asterlux