【问题标题】:How to make a scalable gradient in kivy如何在 kivy 中制作可扩展的渐变
【发布时间】:2021-05-13 09:47:52
【问题描述】:

我希望有一个渐变色作为我的应用程序的背景,并且我还希望它是可缩放和动画的。我已经检查了有关如何执行此操作的其他链接,结果并不是很有趣。

一个 stackoverflow 问题建议用行填充整个程序并更改它们的属性,但这不是太臃肿而且如果他们调整程序大小怎么办?您要么必须调整所有行的大小,要么根据大小添加或删除它们。

我在 github 上只找到了一篇帖子,它似乎可以工作,但我不明白,我也不知道它是否具有动画效果,有时会在更新屏幕和调整大小之前创建黑色空间。

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

这里是github上相对工作梯度的链接:https://gist.github.com/gottadiveintopython/d9a2935560469bd8a8d0a890180003c7

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

How to make gradient background in Kivy

使用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()

代码结果:

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

【问题讨论】:

    标签: python python-3.x kivy gradient


    【解决方案1】:

    最新documentaation说用:

    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 参数指定有多少渐变不会是黑色。因此,将factor 设置为2(如上面的代码)只有渐变的上半部分不会是黑色的。同样,3 的值会导致只有前三分之一不是黑色。 factor 不得小于零。 1factor 产生原始渐变,0factor 不产生渐变(全白)。

    【讨论】:

    • 它起作用了,但是,如何更改渐变本身的颜色和长度?我可以更改矩形颜色,这会改变它淡出的颜色,但我该如何修改开头?顺便谢谢
    • 对不起,我不明白这个问题。 Color: 改变了颜色,但是渐变的长度是什么意思?
    • 我应该怎么做才能让黑色渐变占据纹理的大部分?
    猜你喜欢
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多