我在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。该列表