2016-10-16 4 views
3

Понятно, что я новичок в киви, пытаясь написать простой графический интерфейс с треугольными кнопками (и я хочу, чтобы они были приличными, а не только изображения, которые по-прежнему являются квадратным холстом, нажмите на треугольную часть). Таким образом, я нашел этот отличный код, который создает треугольник и получает зону с кликами.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

Вы уже являетесь виджетом, идите прямо за ним, а не через ids. Ids для свойств id, установленных в дочерних элементах виджетов на языке kv, например. если ваш TriangleButton был ребенок Image с id: myimage, вы получите его с этим:

self.ids.myimage 

Поэтому удаление ненужных вещей достаточно:

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

Это также хорошо, чтобы напечатать то, что вы на самом деле ищет - если он печатает какой-либо объект или если эта вещь вообще не существует. И привязка лучше, чем положить что-то вручную в on_press :)

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

Отлично, спасибо! – Asterlux

Смежные вопросы