不用说,我是一个新手,试图用三角形按钮编写一个简单的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)
但是我真的不知道。如有任何帮助,不胜感激
您已经在小部件中,直接进入它,而不是通过ids
。Ids
是属性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)