首页 > 解决方案 > 从线程 kivy/kivymd 创建时图像未显示

问题描述

我正在开发一个应用程序,我需要图像在特定时间独立显示。我已经使用 python 的 stock threading 模块设置了一个线程,它可以正常运行和工作,而不是显示黑色方块的图像。有谁知道如何修理它?

这是我重现该问题的代码:

import threading
from kivy.app import App
from kivy.uix.image import Image
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout

class TestApp(App):
    def build(self):
        self.fl = FloatLayout()
        self.fl.add_widget(Button(text="show image", on_press=self.start_thread))
        return self.fl

    def insertfunc(self):
        self.fl.add_widget(Image(source="HeartIcon.png"))

    def start_thread(self, instance):
        threading.Thread(target=self.insertfunc).start()

TestApp().run()

任何帮助将不胜感激!

标签: pythonimagekivyrenderingkivymd

解决方案


add_widget()必须在主线程上完成。我假设您正在使用threading,因为Thread除了add_widget(). 基于该假设,这是您的代码的修改版本,可以满足我的要求:

import threading

from kivy.app import App
from kivy.clock import Clock
from kivy.uix.image import Image
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout

class TestApp(App):
    def build(self):
        self.fl = FloatLayout()
        self.fl.add_widget(Button(text="show image", on_press=self.start_thread))
        return self.fl

    def insert_image(self, dt):
        self.fl.add_widget(Image(source="HeartIcon.png"))

    def insertfunc(self):
        # do some calculations here
        Clock.schedule_once(self.insert_image)

    def start_thread(self, instance):
        threading.Thread(target=self.insertfunc).start()

TestApp().run()

如果您没有在新线程中做任何其他事情,那么您实际上不需要另一个线程。该start_thread()方法可以执行以下操作:

self.fl.add_widget(Image(source="HeartIcon.png"))

推荐阅读