#python #python-3.x #kivy #kivymd
#python #python-3.x #kivy #kivymd
Вопрос:
Я хочу, чтобы пользователь приложения для Android вводил изображение, используя функцию on_activity_result, которая привязана к действию, а затем отображала его в виджете kivy image. Я использовал 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. Я думаю, это может быть полезно для понимания причины. После возврата из намерения то же изображение, прочитанное таким же образом, отображается черным.
Ответ №1:
Это может быть проблема с контекстом потока / gl, можете ли вы попробовать добавить mainthread
декоратор в свою on_activity_result
функцию?
from kivy.clock import mainthread
...
@mainthread
def on_activity_result(request, response, data):
...