Python 使用Intent后,用户输入的图像在kivy中显示为黑色

Python 使用Intent后,用户输入的图像在kivy中显示为黑色,python,python-3.x,kivy,kivymd,Python,Python 3.x,Kivy,Kivymd,我希望android应用程序的用户使用绑定到活动的on_activity_result函数输入图像,然后将其显示在kivy图像小部件中。我使用Intent.createChooser作为用户输入: from kivymd.app import MDApp from kivy.lang import Builder from kivy.uix.label import Label from kivy.app import App from kivy.uix.image import Image,

我希望android应用程序的用户使用绑定到活动的on_activity_result函数输入图像,然后将其显示在kivy图像小部件中。我使用Intent.createChooser作为用户输入:

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.app import App
from kivy.uix.image import Image, CoreImage

class MainApp(App):
    def build(self):
        return Builder.load_file('main.kv')
    def set_texture(self, root):
        i = root.children[0].children[0] # getting the image widget
        ##set the image as bytes
        with open("./small image.png", "rb") as image:
            f = image.read()
            bytesArray = bytearray(f)
        import io
        img = CoreImage(io.BytesIO(bytesArray), ext="png").texture      
        i.texture = img
    def set_texture_after_intent(self):
        from jnius import autoclass, cast
        from android import activity
        activity.bind(on_activity_result=on_activity_result)
        PythonActivity = autoclass("org.kivy.android.PythonActivity")
        context = PythonActivity.mActivity
        currentActivity = cast('android.app.Activity', PythonActivity.mActivity)
        AndroidString = autoclass('java.lang.String')
        Intent = autoclass('android.content.Intent')
        intent = Intent()
        intent.setType("image/*")
        intent.setAction(Intent.ACTION_GET_CONTENT)
        currentActivity.startActivityForResult(
        Intent.createChooser(intent, cast('java.lang.CharSequence', AndroidString("Select Picture"))), 1)

def on_activity_result(request, response, data):
    #get the image widget
    root = App.get_running_app().root
    #call same display function
    App.get_running_app().set_texture(root)

MainApp().run()
kv文件:

Screen:
    id:myscreen
    BoxLayout:
        Button:
            text:'change image normally'
            on_release: app.set_texture(root)
        Button:
            text:'change image after intent'
            on_release: app.set_texture_after_intent()
        Image:
            id: image_id
            source:'./big image.png'

如果我改变了图像的纹理而没有从意图中恢复,它通常会在android设备上显示。我认为这有助于了解原因。从意图返回后,以相同方式读取的相同图像显示为黑色。

这可能是线程/gl上下文问题,能否尝试将
主线程
装饰器添加到
on\u activity\u result
函数中

从kivy.clock导入主线程
...
@主线
def on_activity_结果(请求、响应、数据):
...

这可能是线程/gl上下文问题,能否尝试将
主线程
装饰器添加到
on\u activity\u result
函数中

从kivy.clock导入主线程
...
@主线
def on_activity_结果(请求、响应、数据):
...