如何在另一种方法中将所选图像的路径显示为变量?

How to display path of selected image as a variable in another method?

我有两种方法,get_image_one() 打开 Tkinter 文件选择器和 returns 在 kv 文件中显示的图像。我希望将所选图像设置为方法 check_for_image() 中的源,以便可以通过 check_for_image() 对所选图像进行进一步处理,例如检查用户选择的图像有任何文本等。此测试的逻辑将由 check_for_image()

提供

请告诉我这是否是解决此问题的最佳方法,即有两种不同的方法,一种用于选择文件,第二种用于验证文件。感谢您的时间和关注。

下面是我的完整示例。

main.py

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.core.window import Window
from kivy.uix.popup import Popup
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty

from tkinter.filedialog import askopenfilename
from tkinter import Tk

class SampBoxLayout(BoxLayout):

    def get_image_one(self):
        '''This method is called by button FileChooser, it opens a FileChooser selects the desired image'''
        Tk().withdraw()
        img1 = askopenfilename(initialdir = "/",title = "Select file",filetypes = (("jpeg files","*.jpg"),("all files","*.*")))
        self.first_image.source = img1

    def check_for_image(self):
        '''This method is called by button TextIdentifier
           1. It needs to get the image selected by the above FileChooser
           2. The selected Image can be analysed further Ex: to check the if the selected image contains any text etc.
        '''
        pass

class SampleApp(App):
    def build(self):
        # Set the background color for the window
        Window.clearcolor = (1, 1, 1, 1)
        return SampBoxLayout()

sample_app = SampleApp()
sample_app.run()

sample.kv

#:kivy 1.10.0
<ColoredBackground@Image>:
    font_size: '48sp'
    color: (.9, .5, .4, 1)
    canvas.before:
        Color:
            rgb: (.2, .9, .9)
        Rectangle:
            pos: self.x + sp(2), self.y + sp(2)
            size: self.width - sp(5), self.height - sp(4)

<SampBoxLayout>:
    first_image: first_image     # <----
    orientation: "vertical"
    padding: 10
    spacing: 10

    # ---------- Button FileChooser ----------
    BoxLayout:
        orientation: "horizontal"
        height: 30

        Button:
            text: "FileChooser"
            on_press: root.get_image_one()
        Button:
            text: "TextIdentifier"
            on_press: root.check_for_image()

    # ---------- Display Images----------
    BoxLayout:
        orientation: "vertical"
        height: 30

        ColoredBackground:
            id: first_image  # <----
            size: self.parent.width, self.parent.height
            allow_stretch: True
            keep_ratio: False

解决方案

  1. img1 替换为 self.img1 以使用其他方法访问图像。
  2. get_image_one()方法中,目前Kivy应用程序在没有选择时崩溃。因此,检查用户是否选择了任何图像。什么都不选怎么办?例如显示弹出消息。
  3. check_for_image()方法中,如果所有检查都通过,则将图像文件分配给图像源。

建议

如果有很多支票,请将其分开。始终保持模块小,以便于理解和维护。

片段

class SampBoxLayout(BoxLayout):

    def get_image_one(self):
        '''This method is called by button FileChooser, it opens a FileChooser selects the desired image'''
        Tk().withdraw()     # we don't want a full GUI, so keep the root window from appearing
        self.img1 = askopenfilename(initialdir="/", title="Select file",
                                    filetypes=(("jpeg files", "*.jpg"), ("all files", "*.*")))
        if not self.img1:
            # TODO
            # e.g. Kivy Popup message
            print("No image file selected!")

    def check_for_image(self):
        '''This method is called by button TextIdentifier
           1. It needs to get the image selected by the above FileChooser
           2. The selected Image can be analysed further Ex: to check the if the selected image contains any text etc.
        '''
        print(self.img1)
        self.first_image.source = self.img1
        self.first_image.reload()

输出