gpt4 book ai didi

python - 如何在 kivy 上按下按钮时更改不透明度

转载 作者:行者123 更新时间:2023-11-30 23:11:08 35 4
gpt4 key购买 nike

单击按钮时如何更改随机抛出的图像的不透明度? (使用 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() 类中进行定义,但它说它没有 Canvas 属性。

最佳答案

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

我还强烈建议查看 kv 语言,以使这种事情变得更容易。它还可以帮助摆脱许多添加小部件并将事物绑定(bind)到其他部件的样板代码。请参阅kv docsa good crash course video了解更多信息。

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

首先导入属性的导入:

from kivy.properties import NumericProperty

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

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 用户,因此可能有更好的方法来确定按下了哪个按钮并相应地调整不透明度。)

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

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

关于python - 如何在 kivy 上按下按钮时更改不透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30311417/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com