如何在kivy中制作可缩放的渐变
How to make a scalable gradient in kivy
我想要 渐变颜色 作为我的应用程序的背景,我还希望它 可缩放和动画化 。我已经检查了其他 link 如何执行此操作,但结果并不是很有趣。
一个 Whosebug 问题建议用行填充整个程序并更改它们的属性,但这不是太臃肿吗?如果他们调整程序大小怎么办?您要么必须调整所有行的大小,要么根据大小添加或删除它们。
我在 github 上只找到了一个 post,它似乎可以工作,但我不明白它,而且我不知道它是否可以动画化,有时会产生黑色更新屏幕和调整大小之前的空格。
我访问了 kivy 文档并根据文档制作了一个纹理,但是渐变被切成两半,并被一些荒谬的线条所取代。同样在调整大小时,纹理质量下降。
这里是 link 到 github 上相对有效的梯度:https://gist.github.com/gottadiveintopython/d9a2935560469bd8a8d0a890180003c7
link 关于 Whosebug 的低效方法,如果你想看一看:
使用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()
代码结果:
附带说明一下,我也不想使用图像,可动画是指在应用程序开始时我希望渐变从一侧开始并扩展到另一侧
最新的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
不得小于零。 1
的 factor
产生原始渐变,0
的 factor
不产生渐变(全白)。
我想要 渐变颜色 作为我的应用程序的背景,我还希望它 可缩放和动画化 。我已经检查了其他 link 如何执行此操作,但结果并不是很有趣。
一个 Whosebug 问题建议用行填充整个程序并更改它们的属性,但这不是太臃肿吗?如果他们调整程序大小怎么办?您要么必须调整所有行的大小,要么根据大小添加或删除它们。
我在 github 上只找到了一个 post,它似乎可以工作,但我不明白它,而且我不知道它是否可以动画化,有时会产生黑色更新屏幕和调整大小之前的空格。
我访问了 kivy 文档并根据文档制作了一个纹理,但是渐变被切成两半,并被一些荒谬的线条所取代。同样在调整大小时,纹理质量下降。
这里是 link 到 github 上相对有效的梯度:https://gist.github.com/gottadiveintopython/d9a2935560469bd8a8d0a890180003c7
link 关于 Whosebug 的低效方法,如果你想看一看:
使用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()
代码结果:
附带说明一下,我也不想使用图像,可动画是指在应用程序开始时我希望渐变从一侧开始并扩展到另一侧
最新的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
不得小于零。 1
的 factor
产生原始渐变,0
的 factor
不产生渐变(全白)。