python - 尝试用 Kivy 和线程划清界限

标签 python multithreading python-3.x kivy

我现在正在制作一个 Kivy 应用程序,在其中一部分中,我正在获取 float 数组形式的数据,并且我想使用该数据在 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 画一条线。 但相反,应用程序打开并且不执行任何操作,我们将不胜感激!

最佳答案

我稍微修改了你的示例。
尝试在 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()

关于python - 尝试用 Kivy 和线程划清界限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47726887/

相关文章:

python - 将基于字符串的 NaN 转换为 numpy NaN

python - AWS Systems Manager "In Progress"命令限制为 5 个?

python - BFS 输出图的最短路径

python - 如何在 python 3.6 以下获得类似 Mock().assert_used_once 的行为?

java - Java对象的并发

multithreading - 如何设计处理到达队列的消息的服务

ios - 在 iOS 上,如何在新线程中检查 View Controller View 中的 UISwitch 值?

python - 仅替换数据框中列的第一个字符

python-3.x - 在python中使用numpy简单地添加两个数组?

python-3.x - GEKKO中优化问题的并行化