2017-12-09 6 views
0

私はKivyアプリケーションを今作成していますが、その一部で浮動小数点数の配列としてデータを取得しています。データ。 問題は、常に実行したいので、スレッドを使用していますが、Kivyはラインを描画しませんでした。 、私はこのコードがポイント100、200でラインを描きたい Kivyを使って線を描こうとすると、スレッドが描画されます

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.graphics import Line 
from threading import Thread 


class MyWidget(Widget): 
    def Draw(self): 
     with self.canvas: 
      Line(points=[100, 200, 300, 400]) 
class MainApp(App): 

    def build(self): 
     return MyWidget() 




Thread(target=MyWidget().Draw).start() 
MainApp().run() 

300、400 ではなく、アプリが開き、:ここでの問題を示しているコードのストリップダウンバージョンです何もしない、助けが評価される!

+1

描画操作は、メインスレッドから実行する必要があります。スレッドから直接実行するのではなく、描画を行う関数に対して 'Clock.schedule_once(your_drawing_function、0)'を実行してみてください。 – inclement

答えて

0

少し修正しました。
スレッドをinitメソッドで開始してみてください。 MyWidget().Drawを実行したときは、新しいMyWidgetオブジェクトで行いますが、ビルドメソッドで返されたオブジェクトではありません。その線は決して描かれません。しかし、画面上にない別のウィジェットの行。
は次のように試してみてください:

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.graphics import Line, InstructionGroup 
from threading import Thread 
from random import randint 
import time 



class MyWidget(Widget): 

    def __init__(self, **kwargs): 
     super(MyWidget, self).__init__(**kwargs) 

     self.ig = InstructionGroup() 
     self.line = Line(points=[100, 200, 300, 400]) 
     self.ig.add(self.line) 
     self.canvas.add(self.ig) 

     Thread(target=self.draw).start() 


    def draw(self): 
     while True: 
      self.line.points = [randint(0,400) for i in range(4)] 
      time.sleep(0.5) 



class MainApp(App): 

    def build(self): 
     return MyWidget() 



MainApp().run() 
+0

これは私の問題を解決しました!ありがとうございました! –

+0

@TalKあなたは幸せです。 – EL3PHANTEN

関連する問題