在Kivy中更改按钮的背景颜色

35

我刚开始接触Kivy,想要指定一个按钮的背景颜色,但是遇到了问题。以下是我的简单示例:

# custombutton.py

from kivy.app import App
from kivy.uix.widget import Widget


class MyWidget(Widget):
    pass


class CustomButtonApp(App):
    def build(self):
        return MyWidget()


if __name__ == '__main__':
    CustomButtonApp().run()

伴随而来的kv文件 custombutton.kv:

#:kivy 1.7.2

<MyWidget>:
    canvas:
        Color:
            rgb: (0.93, 0.93, 0.93)
        Rectangle:
            pos: self.pos
            size: self.size

    Button:
        center: self.parent.center
        font_size: 14
        height: 28
        background_color: (1.0, 0.0, 0.0, 1.0)
        text: "I'm a Button"

我确定我错过了一些显而易见的东西,但我已经折腾了一个多小时,却一无所获。按钮似乎会变成深红色的微弱提示:

在此输入图片描述

这不是在Kivy中指定按钮背景颜色的方式吗?

谢谢!

4个回答

38

这篇文章发布已经有一段时间了,也许随着更新他们提出了更好的解决方案:

Button:
    background_normal: ''
    background_color: 1, .3, .4, .85

由于按钮有默认的灰色,添加背景颜色只会给按钮着色。通过将background_normal设置为''来重置默认颜色为白色。从白色画布开始,background_color按预期工作。

文档

1) https://kivy.org/docs/api-kivy.uix.button.html?highlight=button#module-kivy.uix.button


35
啊,这是一个常见的困惑。问题在于Button.background_color实际上作为一种色彩着色效果,而不仅仅是一个块状颜色。由于默认背景是灰色图像(如果您制作未经样式化的按钮,则通常会看到该图像),因此您最终看到的是对该灰色图像的红色着色 - 这就是您观察到的深红色。
您可以通过将背景图像替换为纯白色图像(它不必超过几个像素),或通过其他方式调整background_normalbackground_down属性来获得所需的行为。当您的background_color对新的纯白色图像进行着色时,您将获得所需的纯红色。
我猜文档中这并不是很清楚,我会尝试改进它。

1
我不太确定边框的实际工作原理。我只是在我的小部件画布上直接使用顶点指令(如Line等)绘制自己简单的边框。 - inclement
您可以为 background_normalbackground_down 图像添加边框:https://dev59.com/JWMk5IYBdhLWcg3wvQcU。这些图像被分割成一个类似于 css border-image 的 9 宫格。您必须确保角落匹配。 - toto_tico

0

使用background_normal =''的问题是,它会将Kivy按钮图像的凸起边缘/阴影和设置清除。获得一个特定颜色的凸起按钮的一种方法是使用GIMP或其他编辑器创建自己的纹理集。但是,通过一些试验和错误,我发现Buttonbackground_color属性可以实现着色以及文档中记录的阴影。换句话说,它可以具有“RGB”值>1。因此,要在Kivy按钮默认主题下获取精确的按钮颜色和凸起边缘,请使用:

import numpy as np
# the defaulttheme for kivy buttons is grey 88,88,88
kivy_defaulttheme_color = np.array([88,88,88,256])/256
desired_button_color = np.array([78,101,115,256])/256
tintshade_color = desired_button_color / kivy_defaulttheme_color
Button(background_color = tintshade_color)

它展示了色调和阴影。


0
我认为J B的解决方案是最好的。 此外,由于分数运算,你可以更简单地使用(R/88, G/88, B/88)来设置按钮的颜色。
如果期望的颜色是(150,100,89)
设置
background_color = (150/88 , 100/88 , 89/88)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接