簡體   English   中英

Kivy在印刷機上更改自定義按鈕的顏色

[英]Kivy changing color of a custom button on press

不言而喻,我是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)

但是我真的不知道。 任何幫助,將不勝感激

您已經在小部件中,直接轉到它,而不是通過ids Ids用於以kv語言設置在小部件子代中的屬性id ,例如,如果你的TriangleButton有一個帶有id: myimage的子Image ,你就可以得到它:

self.ids.myimage

因此刪除不必要的東西就足夠了:

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

打印你真正想要的東西也很好 - 如果它打印一些物體,或者那個東西甚至不存在。 並且綁定比手動放入on_press更好:)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM