按kivy上的按钮时如何改变不透明度

时间:2015-05-18 19:31:47

标签: python kivy

如何在单击按钮时更改随机抛出图像的不透明度? (使用kivy)。

from random import randint
from random import random
from kivy.app import App 
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.graphics import Color, Line, Rectangle
from kivy.uix.filechooser import FileChooserListView, FileChooserIconView
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.image import Image
from kivy.uix.floatlayout import FloatLayout



class MyBackground(Widget):

    def __init__(self, **kwargs):
        x = randint(1,10)
        print (x)
        y = 'water.png'
        if x==1:
            y = 'a.png'
        if x==2:
            y = 'b.png'
        if x==3:
            y = 'c.png'
        if x==4:
            y = 'd.png'
        if x==5:
            y = 'e.png'
        if x==6:
            y = 'f.png'
        if x==7:
            y = 'g.png'
        if x==8:
            y = 'h.png'
        if x==9:
            y = 'i.png'
        if x==10:
            y = 'j.png'
        super(MyBackground, self).__init__(**kwargs)
        with self.canvas:
            Color(1, 1, 1, 0.5)
            self.bg = Rectangle(source=y, pos=self.pos, size=self.size)
        self.bind(pos=self.update_bg)
        self.bind(size=self.update_bg)
        Color(1, 0, 1, 0.5)

    def update_bg(self, *args):
        self.bg.pos = self.pos
        self.bg.size = self.size


class MyPaintWidget(Widget):
    def on_touch_down(self, touch):
        with self.canvas:
            Color(1, 1, 1)
            d = 30.
            touch.ud['line'] = Line(points=(touch.x, touch.y))

    def on_touch_move(self, touch):
        touch.ud['line'].points += [touch.x, touch.y]

class MyRandomApp(App):

    def build(self):
        layout = BoxLayout(spacing=10, orientation='vertical')
        b = BoxLayout(spacing=0)
        btn1 = Button(text='opacity 40%', size_hint=(.2, .2))
        btn3 = Button(text='opacity 20%', size_hint=(.2, .2))
        btn4 = Button(text='opacity 10%', size_hint=(.2, .2))
        btn5 = Button(text='opacity 0%', size_hint=(.2, .2))
        b.add_widget(btn1)
        b.add_widget(btn3)
        b.add_widget(btn4)
        b.add_widget(btn5)
        layout.add_widget(b)
        background = MyBackground(size_hint=(1, 10))
        layout.add_widget(background)
        painter = MyPaintWidget()
        layout.add_widget(painter)


        return layout



if __name__ == '__main__':
    MyRandomApp().run()

我试图在MyRandomApp()类中有一个定义,但它说它没有画布属性。

1 个答案:

答案 0 :(得分:3)

我建议在背景小部件中使用kivy属性获取不透明度,然后将按钮绑定到更新不透明度的函数。

我也强烈建议使用kv语言来简化这类事情。它还可以帮助摆脱许多添加小部件并将内容绑定到其他内容的样板代码。有关详细信息,请参阅kv docsa good crash course video

但我会回答没有kv的方式。为了清晰起见,我还要删除随机图像部分,这对于这个例子来说并不重要。

首先导入属性的导入:

from kivy.properties import NumericProperty

然后将数字属性添加到您的背景类。现在您可以在颜色指令中使用该属性。因为您使用不透明度作为属性,kivy将自动绑定它,因此当不透明度更改时,Color指令也会更改。所以你的背景课就变成了:

class MyBackground(Widget):
    opacity = NumericProperty(0.5)

    def __init__(self, **kwargs):
        y = 'test.jpg'
        super(MyBackground, self).__init__(**kwargs)
        with self.canvas:
            Color(1, 1, 1, self.opacity)
            self.bg = Rectangle(source=y, pos=self.pos, size=self.size)

        self.bind(pos=self.update_bg)
        self.bind(size=self.update_bg)
        Color(1, 0, 1, 0.5)

    def update_bg(self, *args):
        self.bg.pos = self.pos
        self.bg.size = self.size

然后保持对按钮和背景小部件的引用,并将函数连接到按钮事件,该按钮事件基于按下的按钮更新背景小部件的不透明度。 (请注意,我不是一个超级经验丰富的kivy用户,因此可能有更好的方法来确定按下哪个按钮并相应地自我遮挡。)

所以你的应用程序变成: class MyRandomApp(App):

def build(self):
    layout = BoxLayout(spacing=10, orientation='vertical')
    b = BoxLayout(spacing=0)

    self.btn1 = Button(text='opacity 40%', size_hint=(.2, .2))
    self.btn3 = Button(text='opacity 20%', size_hint=(.2, .2))
    self.btn4 = Button(text='opacity 10%', size_hint=(.2, .2))
    self.btn5 = Button(text='opacity 0%', size_hint=(.2, .2))

    b.add_widget(self.btn1)
    b.add_widget(self.btn3)
    b.add_widget(self.btn4)
    b.add_widget(self.btn5)
    layout.add_widget(b)

    self.background = MyBackground(size_hint=(1, 10))

    layout.add_widget(self.background)
    painter = MyPaintWidget()
    layout.add_widget(painter)

    self.btn1.bind(on_press=self.set_opacity)
    self.btn3.bind(on_press=self.set_opacity)
    self.btn4.bind(on_press=self.set_opacity)
    self.btn5.bind(on_press=self.set_opacity)

    return layout

def set_opacity(self,widget):
    if widget is self.btn1:
        self.background.opacity = 0.40
    elif widget is self.btn3:
        self.background.opacity = 0.20
    elif widget is self.btn4:
        self.background.opacity = 0.10
    elif widget is self.btn5:
        self.background.opacity = 0.00