Kivy Python FileChooser

问题描述

我要创建一个文件选择器按钮,它将选择一个图像文件并在窗口上显示以对图像进行分类
我只是用kivy python进行了图像识别,但是想添加一个按钮,用户可以在其中从自己的系统中选择图像文件。 请帮我,在下面的代码添加filechooser按钮:

main.py文件

import kivy.app
import Fruits
from kivy.uix.popup import Popup
from kivy.uix.tabbedpanel import TabbedPanel
from kivy.properties import ObjectProperty,StringProperty
from kivy.lang import Builder

class FirstApp(kivy.app.App):
    def classify_image(self):
        img_path = self.root.ids["img"].source

        img_features = Fruits.extract_features(img_path)

        predicted_class = Fruits.predict_output("c:\\Users\\aakip\\Documents\\Python\\face_recognition school project\\weights.npy",img_features,activation="sigmoid")

        self.root.ids["label"].text = "Predicted Class : " + predicted_class

if __name__ == "__main__":

    firstApp = FirstApp(title="Fruits 360 Recognition.")
    firstApp.run()

Fruits.py:

import numpy
import PIL.Image


def sigmoid(inpt):
    return 1.0/(1.0+numpy.exp(-1*inpt))
    
def relu(inpt):
    result = inpt
    result[inpt<0] = 0
    return result

def predict_output(weights_mat_path,data_inputs,activation="relu"):
    weights_mat = numpy.load(weights_mat_path,allow_pickle=True) #allow_pickle=True
    r1 = data_inputs
    for curr_weights in weights_mat:
        r1 = numpy.matmul(r1,curr_weights)
        if activation == "relu":
            r1 = relu(r1)
        elif activation == "sigmoid":
            r1 = sigmoid(r1)
    r1 = r1[0,:]
    predicted_label = numpy.where(r1 == numpy.max(r1))[0][0]
    class_labels = ["Apple","RaspBerry","Mango","Lemon"]
    predicted_class = class_labels[predicted_label]
    return predicted_class

def extract_features(img_path):
    im = PIL.Image.open(img_path).convert("HSV")
    fruit_data_hsv = numpy.asarray(im,dtype=numpy.uint8)

    indices = numpy.load(file="c:\\Users\\aakip\\Documents\\Python\\face_recognition school project\\indices.npy")
    #indices  = numpy.load(file="indices.npy")
    
    
    hist = numpy.histogram(a=fruit_data_hsv[:,:,0],bins=360)
    im_features = hist[0][indices]
    img_features = numpy.zeros(shape=(1,im_features.size))
    img_features[0,:] = im_features[:im_features.size]
    return img_features

.kv文件

#:kivy 1.10.0
BoxLayout:
    orientation: "vertical"
    Label:
        text: "Predicted Class Appears Here."
        font_size: 30
        id: label
    BoxLayout:
        orientation: "horizontal"
        Image:
            source: "apple.jpeg"
            id: img
    Button:
        text: "Classify Image."
        font_size: 30
        on_press: app.classify_image()

<FileChoosePopup>:
    title: "Choose a .jpeg File"
    size_hint: .9,.9
    auto_dismiss: False

    BoxLayout:
        orientation: "vertical"
        FileChooser:
            id: filechooser
            FileChooserIconLayout

        BoxLayout:
            size_hint: (1,0.1)
            pos_hint: {'center_x': .5,'center_y': .5}
            spacing: 20
            Button:
                text: "Cancel"
                on_release: root.dismiss()
            Button:
                text: "Load"
                on_release: root.load(filechooser.selection)
                id: ldbtn
                disabled: True if filechooser.selection==[] else False

谢谢!

解决方法

您是否尝试查看Kivi文档? https://kivy.org/doc/stable/api-kivy.uix.filechooser.html

我相信这是您正在寻找的一部分。

class Root(FloatLayout):
    loadfile = ObjectProperty(None)
    def show_load(self):
        content = LoadDialog(load=self.load,cancel=self.dismiss_popup)
        self._popup = Popup(title="Load file",content=content,size_hint=(0.9,0.9))
        self._popup.open()
    def load(self,path,filename):
            with open(os.path.join(path,filename[0])) as stream:
                self.text_input.text = stream.read()
    
            self.dismiss_popup()