python - 从线程 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()
任何帮助将不胜感激!
解决方案
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"))
推荐阅读
- flutter - 如何在 Flutter 中使用带有 Switch 的 Hive - 所以当点击返回时,开关仍然被激活?
- javascript - 如何从动态加载的网页中提取内容(使用 MutationObservers)
- java - RabbitMQ 接收器未退出
- python - Python 根据我声明循环条件的方式做出不同的反应
- php - get_template_part 似乎正在删除 h2 上的一个类
- signals - 正交性在数字信号处理中逼近函数的重要性是什么?
- python - 如何摆脱 GridSpec 中的行之间的空间?
- php - 如何让 ACF 帖子对象只显示 1 个帖子?
- linear-programming - 有没有一种方法可以将某个值分配给 ILOG CPLEX 中的一组决策变量?
- amazon-web-services - AWS Cognito 不使用我的自定义消息 lambda