当前位置: 首页 > 面试题库 >

如何在运行时更改Kivy中小部件的颜色?

叶展
2023-03-14
问题内容

我在Kivy中更改简单小部件的颜色时遇到问题。创建窗口小部件时可以设置颜色,但此后无法更改。

这是简单的布局定义文件circletest.kv。它定义了一个圆圈,其中颜色(实际上只是rgba中的r),位置和大小都链接到小部件类中的变量。

#:kivy 1.4.1

<CircleWidget>:
    canvas:
        Color:
            rgba: self.r,1,1,1
        Ellipse:
            pos: self.pos
            size: self.size

这是应用程序circletest.py。它创建并显示简单的小部件。创建对象时成功设置了颜色和位置。单击窗口小部件时,窗口小部件可以更改其自身位置,但是当我尝试更改颜色时,什么也没有发生。

import kivy
kivy.require('1.4.1')
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget

Builder.load_file('circletest.kv')

class CircleWidget(Widget):

    def __init__(s, **kwargs):
        s.size= [50,50]
        s.pos = [100,50]
        s.r = 0
        super(CircleWidget, s).__init__(**kwargs)

    def on_touch_down(s, touch):
        if s.collide_point(touch.x,touch.y):    
            s.pos = [s.pos[1],s.pos[0]]           # This works
            s.r = 1.0                       # <---- This does nothing!

class TestApp(App):

    def build(s):
        parent = Widget()
        w = CircleWidget()
        parent.add_widget(w)
        return parent

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

谁能看到这个问题?

更新

仍然不确定这个问题的答案是什么,但是我确实有一个解决方法:

在.kv文件中,我将颜色指向对象中的变量。用于提取初始颜色:

Color:
    rgba: self.col

当我想从.py文件更改颜色时,我遍历画布中的所有指令并修改“颜色”类型的第一个。显然,这是一种黑客行为,不适用于具有多个Color:属性的小部件:

for i in s.canvas.get_group(None):
    if type(i) is Color:
        i.r, i.g, i.b, i.a = v
        break

我将它们全部包装在一个属性中,因此使用起来很简洁:

class CircleWidget(Widget):

    def get_col(s):
        return s._col

    def set_col(s,v):
        for i in s.canvas.get_group(None):
            if type(i) is Color:
                i.r, i.g, i.b, i.a = v
                break
        s._col = v

    col = property(get_col, set_col)

    def __init__(s, **kwargs):
        s.size= [50,50]
        s.pos = [100,50]
        s._col = (1,1,0,1)
        super(CircleWidget, s).__init__(**kwargs)

    def on_touch_down(s, touch):
        if s.collide_point(touch.x,touch.y):    
            s.col = (s.col[::-1]) # Set to some other color

似乎现在可以工作。如果您知道这样做的更好方法,请告诉我。我敢肯定必须有一个更简单的方法,并且我缺少明显的东西!


问题答案:

在初始版本中,您只是缺少属性的声明

from kivy.properties import NumericProperty

在标题和

r = NumericProperty(0)

就在 class CircleWidget(Widget):

另外,您还声明您的kv文件名为circletest.kv,但您的应用程序名为TestApp,因此您应更改其中一个以使其连贯,否则将找不到您的kv文件,但由于您未举报任何问题,我想这只是一个错字。编辑:刚看到Builder.load_file确定,

干杯。



 类似资料:
  • 问题内容: 我有这种变化的背景颜色的例子的创立负荷使用或者与 但是,我想在一个复选框上创建一个事件,将其选中时将背景色更改为绿色,而取消选择时将其更改为默认值。 我无法使用上述方法进行这项工作。 有任何想法吗? PS:由于某些原因,我可以通过使用而不是背景来更改前景色 问题答案: LAF可以随意忽略某些(仅可见的?不知道的)JComponent属性的自定义设置,如以下文档所述: 外观和感觉取决于该

  • 我试图在屏幕中间构造一个窗口小部件。我没有使用pos_hint或size_hint,因为我将在以后更改小部件的位置,但是当我构建小部件时,它的大小和位置不正确。这是我的密码: 为什么小部件的大小不等于窗口大小的十分之一,为什么它的中心在窗口的右上角?

  • 问题来了:我的应用程序中有几个面板,形状与背景相同,但对于每个形状,我想要不同的边框(笔画)颜色。我不想创建3个形状,唯一的区别是在笔画颜色上。是否可以在运行时更改笔划值?

  • 我一直在玩KivyPong教程,了解框架的最新情况,看看是否可以实现一些想法。我已经删除了大部分乒乓球功能,所以我只能在屏幕上显示弹跳球,并添加了一些代码来生成屏幕上的多个弹跳球,在触摸时生成。效果很好。然后,我添加了一些额外的画布说明,因此我将绘制一条线,指示球移动的方向。这就是事情变得奇怪的地方。第一个球的动作就像它应该做的一样,在屏幕上弹跳。但接下来的任何点击都会产生球,球会离开屏幕,随机改

  • 我试着用Kivy模仿flappy birds,但目前我的处境很艰难。问题是我不知道如何在视图中创建多个小部件。 现在我的kv文件中有: 目前我能够制作单列,所以问题是如何制作才能有多列?

  • 我正在使用Kivy python库。 我定义了两个小部件。 当程序运行时,我运行第一个小部件。 当按下widgets按钮时,我希望它消失并被第二个widget替换。 这是两个小部件的. kv 我的主python文件运行应用程序,并返回第一个小部件 我的第一个小部件有一个回调。这就是问题代码所属的位置 这里的想法是有一个用户界面管理器。此管理器不像树那样运行UI,而是像列表和堆栈一样运行UI。该列表