Python 如何在kivy中创建可伸缩的渐变

Python 如何在kivy中创建可伸缩的渐变,python,python-3.x,kivy,gradient,Python,Python 3.x,Kivy,Gradient,我希望有一个渐变色作为我的应用程序的背景,我还希望它具有可伸缩性和动画效果。我检查了其他关于如何做到这一点的链接,结果并不是很有趣 一个stackoverflow问题建议用行填充整个程序并更改它们的属性,但这不是太夸张了吗?如果它们调整程序的大小又会怎么样?您必须调整所有线条的大小,或者根据大小添加或删除它们 我在github上只找到了一篇文章,它似乎很有效,但我不理解它,而且我也不知道它是否可以制作动画,有时在更新屏幕和调整大小之前会创建黑色空间 我访问了kivy文档,并根据文档制作了一个纹理

我希望有一个渐变色作为我的应用程序的背景,我还希望它具有可伸缩性和动画效果。我检查了其他关于如何做到这一点的链接,结果并不是很有趣

一个stackoverflow问题建议用行填充整个程序并更改它们的属性,但这不是太夸张了吗?如果它们调整程序的大小又会怎么样?您必须调整所有线条的大小,或者根据大小添加或删除它们

我在github上只找到了一篇文章,它似乎很有效,但我不理解它,而且我也不知道它是否可以制作动画,有时在更新屏幕和调整大小之前会创建黑色空间

我访问了kivy文档,并根据文档制作了一个纹理,但渐变被切成两半,取而代之的是一些荒谬的线条。调整大小时,纹理的质量也会下降

下面是指向github上相对有效的渐变的链接:

链接到stackoverflow上的低效方法,以防您想查看:

使用kivy.graphics.texture.texture的代码:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.graphics.texture import Texture
from kivy.properties import ObjectProperty
from kivy.core.window import Window


# Exact copy of the docs
texture = Texture.create(size=(64, 64))
size = 64 * 64 * 3
buf = [int(x * 255 / size) for x in range(size)]
buf = ''.join(map(chr, buf)).encode("utf-8")
texture.blit_buffer(buf, colorfmt='rgb', bufferfmt='ubyte')
Builder.load_string('''
<MyLayout>:
    BoxLayout:
        orientation: "vertical"
        size: root.width, root.height

        canvas.before:
            Color:
                rgba: 1, 1, 1, 1
            Rectangle:
                size: self.size
                pos: self.pos
                texture: root.texture_obj''')


class MyLayout(Widget):
    texture_obj = ObjectProperty(texture)


class Application(App):
    def build(self):
        return MyLayout()


if __name__ == "__main__":
    Application().run()
从kivy.app导入应用
从kivy.uix.widget导入widget
从kivy.lang导入生成器
从kivy.graphics.texture导入纹理
从kivy.properties导入ObjectProperty
从kivy.core.window导入窗口
#文件的准确副本
纹理=纹理。创建(大小=(64,64))
尺寸=64*64*3
buf=[int(x*255/大小)表示范围内的x(大小)]
buf=''.join(map(chr,buf)).encode(“utf-8”)
buffer(buf,colorfmt='rgb',bufferfmt='ubyte')
Builder.load_字符串(“”)
:
盒子布局:
方向:“垂直”
尺寸:根.宽度,根.高度
在以下情况之前:
颜色:
rgba:1,1,1,1
矩形:
大小:self.size
pos:self.pos
纹理:根。纹理(对象“”)
类MyLayout(小部件):
纹理_obj=对象属性(纹理)
班级申请(应用程序):
def生成(自):
返回MyLayout()
如果名称=“\uuuuu main\uuuuuuuu”:
应用程序().run()
代码的结果是:

顺便说一句,我也不想使用图像,我所说的动画是指在应用程序开始时,我希望渐变从一侧开始,并扩展到另一侧

buf = bytes(buf)
而不是:

buf = ''.join(map(chr, buf)).encode("utf-8")
我相信这会解决你的问题

如果要调整渐变的黑色程度,只需修改像素的计算。例如:

texture = Texture.create(size=(64, 64))
size = 64 * 64 * 3

def pixel(x, size, factor):
    p = max( 0, int(255 * (factor * x - (factor - 1) * size) / size))
    return p

buf = [pixel(x, size, 2) for x in range(size)]
buf = bytes(buf)
texture.blit_buffer(buf, colorfmt='rgb', bufferfmt='ubyte')

上述代码使用
pixel()
方法来计算像素值。
factor
参数指定渐变中有多少不是黑色的。因此,当
因子
设置为
2
(如上代码所示)时,只有渐变的上半部分不会是黑色的。类似地,值
3
只会导致前三分之一不是黑色。
系数
不得小于零。
1的
因子
产生原始渐变,而
0的
因子
不产生渐变(全白色)。

它起作用了,但是,如何更改渐变本身的颜色和长度?我可以改变矩形的颜色,这将改变它淡出的颜色,但我如何修改开始?顺便说一下,谢谢。对不起,我不明白这个问题。
颜色:
会改变颜色,但渐变的长度是什么意思?我应该怎么做才能使黑色渐变占据纹理的更大部分?请参阅更新的答案。