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

How to change opacity when pressing buttons on 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()

我试图在 class MyRandomApp() 中定义,但它说它没有 canvas.

的属性

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

我也强烈建议查看 kv 语言,以使这种事情变得更容易。它还可以帮助摆脱大量添加小部件并将事物绑定到其他小部件的样板代码。有关详细信息,请参阅 kv docs and a good crash course video

但我会回答 w/o kv 的方式。为了清楚起见,我还将删除随机图像部分,这对这个例子来说真的无关紧要。

首先导入 属性 的导入:

from kivy.properties import NumericProperty

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

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 我的随机应用程序(应用程序):

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