使用python-kivy如何点击按钮选择手机相册中的图片?

使用python-kivy开发android应用,如何点击按钮选择手机相册中的图片并获取URL?

基于ChatGpt的ai.cx团队的回答

  1. 首先,在你的应用程序中添加一个按钮,用于打开手机相册,并在按钮的 on_release 事件中添加以下代码:
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.image import Image

class MyApp(App):
    def build(self):
        btn = Button(text='Select Image')
        btn.bind(on_release=self.select_image)
        return btn
    def select_image(self, *args):
        img = Image(source=App.get_running_app().open_image())

if __name__ == '__main__':
    MyApp().run()
  1. 然后,在 App 类中添加 open_image() 函数,用于打开手机相册并返回图片的 URL:
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.image import Image
from kivy.core.window import Window

class MyApp(App):
    def build(self):
        btn = Button(text='Select Image')
        btn.bind(on_release=self.select_image)
        return btn
    def select_image(self, *args):
        img = Image(source=App.get_running_app().open_image())
    def open_image(self):
        Window.bind(on_activity_result=self.on_activity_result)
        self.activity.startActivityForResult(Intent(Intent.ACTION_PICK,
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI), 0)
    def on_activity_result(self, requestCode, resultCode, data):
        if data is not None:
            uri = data.getData()
            return uri

if __name__ == '__main__':
    MyApp().run()
  1. 在 on_activity_result 回调函数中,可以从 data 参数中获取图片的 URL,然后返回给 select_image 函数,从而实现点击按钮选择手机相册中的图片并获取 URL 的功能。

您可以使用Kivy的FileChooser组件来选择相册中的图片并获取其URL。请使用以下步骤进行操作:

在您的Kivy应用中添加一个按钮,以打开FileChooser。

给按钮绑定on_press事件。

在on_press事件的回调函数中创建FileChooser组件。

将FileChooser设置为图像类型(如:jpeg,png,jpg)。

使用FileChooser的selection属性获取选择的图像的URL。

以下是一个简单的示例代码:

from kivy.uix.filechooser import FileChooserIconView
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App
from kivy.uix.button import Button

class MyApp(App):
    def callback(self, instance):
        file_chooser = FileChooserIconView(size_hint=(1, 0.7),
                                           pos_hint={'center_x': 0.5, 'center_y': 0.5})
        file_chooser.bind(on_selection=self.selected)
        file_chooser.filters = ["*.jpg", "*.jpeg", "*.png"]
        self.root.add_widget(file_chooser)
        
    def selected(self, chooser, selection):
        print(selection[0])

    def build(self):
        layout = BoxLayout(orientation='vertical')
        btn = Button(text='Select Image', size_hint=(1, 0.1))
        btn.bind(on_press=self.callback)
        layout.add_widget(btn)
        return layout

if __name__ == '__main__':
    MyApp().run()

在上面的代码中,我们在按钮的on_press事件的回调函数中创建了一个FileChooser组件。在选择图像时,它会触发FileChooser的on_selection事件,因此我们将其绑定到了selected回调函数。

  1. 在App.py文件中,添加Button类:
class MyApp(App):
    def build(self):
        self.button = Button(text='Select Image', 
                            size_hint=(.5, .2), 
                            pos_hint={'center_x': .5, 'center_y': .5})
        self.button.bind(on_press=self.selectImage)
        return self.button
  1. 定义selectImage()方法:
def selectImage(self, instance):
    from android.permissions import request_permissions, Permission
    request_permissions([Permission.READ_EXTERNAL_STORAGE])
    from os.path import join
    from kivy.core.image import Image
    from kivy.uix.popup import Popup
    from kivy.uix.image import Image as Img
    from kivy.uix.floatlayout import FloatLayout
    from jnius import autoclass
    # create a popup
    content = FloatLayout()
    popup = Popup(title="Select an Image",
                  content=content, 
                  size_hint=(None, None), 
                  size=(500, 500))
    # open the android file manager
    Environment = autoclass('android.os.Environment')
    Intent = autoclass('android.content.Intent')
    intent = Intent()
    intent.setAction(Intent.ACTION_GET_CONTENT)
    intent.setType("image/*")
    PythonActivity = autoclass('org.kivy.android.PythonActivity')
    currentActivity = PythonActivity.mActivity
    currentActivity.startActivityForResult(intent, 0)
    # set the image to the popup
    def set_image(request_code, result_code, intent):
        if result_code == -1:
            from android.net import Uri
            uri = Uri.parse(intent.getData())
            path = join(Environment.getExternalStorageDirectory().getPath(), uri.getPath()[1:])
            with self.button.canvas:
                # load the image
                Img(source=path, pos=(0, 0), size=self.button.size)
            # close the popup
            popup.dismiss()
            # store the image path
            self.image_path = path
    currentActivity.bind(on_activity_result=set_image)
    popup.open()
  1. 在App.py文件中添加image_path属性:
class MyApp(App):
    image_path = StringProperty(None)
    ...
  1. 运行应用程序,点击按钮,即可在手机相册中选择图片。

该回答引用ChatGPT
请参考下面的解决方案,如果可行还请点击 采纳,感谢!

方法1、请参考下面的代码:


from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.image import Image
import android.permissions
import android.activity

class MyLayout(BoxLayout):
    def __init__(self, **kwargs):
        super(MyLayout, self).__init__(**kwargs)
        self.add_widget(Button(text='Choose Image', on_release=self.select_image))
        self.image = Image(source='default.png')
        self.add_widget(self.image)

    def select_image(self, *args):
        if android.permissions.check_permission('android.permission.READ_EXTERNAL_STORAGE'):
            self.open_gallery()
        else:
            android.permissions.request_permission('android.permission.READ_EXTERNAL_STORAGE', self.open_gallery)

    def open_gallery(self, *args):
        activity = android.activity.getCurrentActivity()
        Intent = autoclass('android.content.Intent')
        intent = Intent()
        intent.setType("image/*")
        intent.setAction(Intent.ACTION_GET_CONTENT)
        activity.startActivityForResult(intent, 0)

class MyApp(App):
    def build(self):
        return MyLayout()

if __name__ == '__main__':
    MyApp().run()

以上代码实现了点击按钮,选择手机相册中的图片,获取图片的URL。首先,使用Kivy的Intent打开手机相册,然后,使用startActivityForResult函数获取图片。需要注意的是,在Android上访问相册需要READ_EXTERNAL_STORAGE权限,需要使用permissions.request_permission函数请求。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
方法2:

1、首先,安装Kivy并创建一个新的Kivy应用程序。
2、在代码中,您需要在布局文件中添加一个按钮。
3、然后,在应用程序的python代码中,使用Kivy的kivy.garden.filebrowser库来显示一个文件选择器,以便用户可以选择相册中的图片。
4、用户选择图片后,您可以获取图片的文件路径,然后使用PIL库加载图片,并将其显示在应用程序的界面上。

还请参考下面的代码 ,按照你的实际情况来修改

from kivy.garden.filebrowser import FileBrowser
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.image import Image
from kivy.lang import Builder

Builder.load_string('''
<MyLayout>:
    orientation: 'vertical'
    Button:
        text: 'Choose image'
        on_press: root.select_image()
    Image:
        id: image
        source: ''
''')

class MyLayout(BoxLayout):
    def select_image(self):
        browser = FileBrowser(select_string='Select',
                              favorites=[('~/Pictures', 'Pictures')])
        browser.bind(on_success=self._fbrowser_success,
                     on_canceled=self._fbrowser_canceled)
        self.add_widget(browser)

    def _fbrowser_success(self, instance):
        self.remove_widget(instance)
        self.ids.image.source = instance.selection[0]

    def _fbrowser_canceled(self, instance):
        self.remove_widget(instance)

class MyApp(App):
    def build(self):
        return MyLayout()

if __name__ == '__main__':
    MyApp().run()


要使用Kivy和Python从手机相册中选择图像,可以使用FileChooser小部件。以下代码是一个简单的示例:

from kivy.uix.filechooser import FileChooserIconView
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App

class FileChooserApp(App):
    def build(self):
        layout = BoxLayout(orientation='vertical')
        self.file_chooser = FileChooserIconView(path='/')
        layout.add_widget(self.file_chooser)
        return layout

if __name__ == '__main__':
    FileChooserApp().run()


然后,您可以添加一个按钮小部件,并将on_press事件绑定到一个方法,该方法将使用FileChooser小部件的选择属性访问所选图像的路径。例如:

from kivy.uix.button import Button

class FileChooserApp(App):
    def build(self):
        layout = BoxLayout(orientation='vertical')
        self.file_chooser = FileChooserIconView(path='/')
        self.select_button = Button(text='Select Image')
        self.select_button.bind(on_press=self.select_image)
        layout.add_widget(self.file_chooser)
        layout.add_widget(self.select_button)
        return layout

    def select_image(self, instance):
        selected_image = self.file_chooser.selection[0]
        print('Selected image:', selected_image)

if __name__ == '__main__':
    FileChooserApp().run()

按下按钮时,此代码将打印所选图像的路径。然后可以使用此路径访问图像文件。

来自 梦想橡皮擦 狂飙组基于 GPT 编写的问答软件
使用kivy的图像加载模块来实现这一功能可以使用下面的步骤:
1.配置按钮并设置回调函数,该回调函数用于调用系统图片选择器;
2.调用Android的系统图片选择器并将用户选择的图片URL回传至应用程序:
3.使用Kivy的图像加载模块获取图片URL并加载图片至应用程序。

img

img

img

img

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

可以使用 python-kivy 框架中的 plyer 库实现:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from plyer import storagepath
from plyer import filechooser

class ExampleApp(App):
    def build(self):
        layout = BoxLayout(orientation='vertical')
        button = Button(text='Select Image', on_press=self.select_image)
        layout.add_widget(button)
        return layout

    def select_image(self, instance):
        try:
            path = storagepath.get_internal_dir()
            file_path = filechooser.open_file(path=path, title='Select Image')[0]
            # do something with the file path
            print("Selected file path: ", file_path)
        except:
            # handle exceptions
            pass

if __name__ == '__main__':
    ExampleApp().run()


这段代码创建了一个包含一个按钮的布局,按钮点击触发 'filechooser.open_file函数选择手机相册中的图片,然后获取该图片的 URL。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632