试图用Kivy和线程绘制一条线

时间:2017-12-09 08:46:15

标签: python multithreading python-3.x kivy

我现在正在制作一个Kivy应用程序,在其中的一部分中,我将数据作为浮点数的数组获取,我想使用数据在Kivy中绘制一条线。 问题是,我希望它不断运行,所以我使用了线程,但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()

我希望这段代码用点100,200,300,400绘制一条线。 但相反,该应用程序打开,什么都不做,将不胜感激!

1 个答案:

答案 0 :(得分: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()