我有一个类,它使用 init 中的Clock.schedule_interval不断更改背景颜色。我想同时创建这个类的多个实例;但是,我认为这意味着创建多个线程是不允许的?我想要的是上半部分改变颜色,而下半部分改变颜色不同。发生的事情只是下半部分是变色而上半部分是黑色。所以这是代码。
/teacher/main.py文件是
from kivy.app import App
from kivy.clock import Clock
from kivy.graphics import Color
from kivy.properties import NumericProperty, ReferenceListProperty
from kivy.uix.gridlayout import GridLayout
from kivy.uix.widget import Widget
from random import randint
class ChangingBackgroundColor(Widget):
r = NumericProperty(.5)
g = NumericProperty(.5)
b = NumericProperty(.5)
a = NumericProperty(1)
color = ReferenceListProperty(r, g, b, a)
def __init__(self,**kwargs):
super(ChangingBackgroundColor, self).__init__(**kwargs)
Clock.schedule_interval(self.update, .2)
def update(self, dt):
position = randint(0,2) # change to randint(0,3) to change a as well
direction = randint(0,1)
if direction == 0:
if self.color[position] == 0:
self.color[position] += .1
else:
self.color[position] -= .1
elif direction == 1:
if self.color[position] == 1:
self.color[position] -= .1
else:
self.color[position] += .1
self.color[position] = round(self.color[position], 2)
self.canvas.add(Color(self.color))
class TeachingApp(App):
def build(self):
grid = GridLayout(rows=2)
a = ChangingBackgroundColor()
b = ChangingBackgroundColor()
grid.add_widget(a)
grid.add_widget(b)
return grid
if __name__ == '__main__':
TeachingApp().run()
和/teacher/teaching.kv文件是
#:kivy 1.0.9
<ChangingBackgroundColor>:
canvas:
Color:
rgba: self.color
Rectangle:
size: self.width, self.height
我看了这里,并且仍然模糊了线程问题。 Clock documentation
这是我提交的第一个问题,如果我在提交问题时做错了,请告诉我。
答案 0 :(得分:1)
你的代码很好,使用Clock.schedule_interval不使用线程(它在主线程中都是),并且即使你有它们也可以在其他线程中使用,尽管回调仍然是发生在主线程中。
问题是你在kv中的Rectangle条目需要:
pos: self.pos
如果没有这个,两个矩形的默认位置为(0,0),所以第二个矩形位于第一个矩形顶部,屏幕的上半部分为黑色。