2016-03-02 122 views
1

我有一個類,不斷改變背景顏色,在init Clock.schedule_interval。我想同時創建這個類的多個實例;但是,我認爲這意味着創建不允許的多個線程?我想要的是上半部分改變顏色,而下半部分改變顏色。發生的事情只有下半部分是變化的顏色,而上半部分是黑色的。所以這裏是代碼。如何在kivy應用程序中同時運行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

這是我提交的第一個問題,所以如果我對提交問題做了任何錯誤,請讓我知道。

回答

1

你的代碼是好的,使用Clock.schedule_interval不使用線程(它全部在主線程中),並且可以從其他線程使用,即使你確實有它們,儘管回調仍然會在主線程中發生。

的問題是,在KV您的矩形記錄必須有:

pos: self.pos 

沒有這一點,這兩個矩形具有默認的POS(0,0),所以第二個是在頂部第一個和屏幕的上半部分是黑色的。

+0

非常感謝你。對於我認爲很困難的事情,這種簡單的解決方 – pizz

相關問題