1

I am new to kivy, and am using kivy and python to make a folder uploader.

I have tried using the code below, found from this link to make a file uploader. I want to make this file uploader into a folder uploader, so I can select an entire directory. I will then perform an operation on the items in that folder and return something.

How would I create a folder selector that return the directory of the selected folder?

Also, when I run this code I receive the error below when trying to load an image. I have taken a look at this question, and made the appropriate edits to the code, but I still receive this error.

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.factory import Factory
from kivy.properties import ObjectProperty
from kivy.uix.popup import Popup
import os


class LoadDialog(FloatLayout):
 load = ObjectProperty(None)
 cancel = ObjectProperty(None)


class SaveDialog(FloatLayout):
 save = ObjectProperty(None)
 text_input = ObjectProperty(None)
 cancel = ObjectProperty(None)


class Root(FloatLayout):
 loadfile = ObjectProperty(None)
 savefile = ObjectProperty(None)
 text_input = ObjectProperty(None)

 def dismiss_popup(self):
    self._popup.dismiss()

 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 show_save(self):
    content = SaveDialog(save=self.save, cancel=self.dismiss_popup)
    self._popup = Popup(title="Save 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()

 def save(self, path, filename):
    with open(os.path.join(path, filename), 'w') as stream:
        stream.write(self.text_input.text)

    self.dismiss_popup()


class Editor(App):
 pass


Factory.register('Root', cls=Root)
Factory.register('LoadDialog', cls=LoadDialog)
Factory.register('SaveDialog', cls=SaveDialog)


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

EDIT

I have attached the code for the editor.kv file, but it can also be found on the link above.

Root:
text_input: text_input

BoxLayout:
    orientation: 'vertical'
    BoxLayout:
        size_hint_y: None
        height: 30
        Button:
            text: 'Load'
            on_release: root.show_load()
        Button:
            text: 'Save'
            on_release: root.show_save()

    BoxLayout:
        TextInput:
            id: text_input
            text: ''

        RstDocument:
            text: text_input.text
            show_errors: True

 <LoadDialog>:
    BoxLayout:
    size: root.size
    pos: root.pos
    orientation: "vertical"
    FileChooserListView:
        id: filechooser

    BoxLayout:
        size_hint_y: None
        height: 30
        Button:
            text: "Cancel"
            on_release: root.cancel()

        Button:
            text: "Load"
            on_release: root.load(filechooser.path, filechooser.selection)

<SaveDialog>:
text_input: text_input
   BoxLayout:
    size: root.size
    pos: root.pos
    orientation: "vertical"
    FileChooserListView:
        id: filechooser
        on_selection: text_input.text = self.selection and self.selection[0] or ''

    TextInput:
        id: text_input
        size_hint_y: None
        height: 30
        multiline: False

    BoxLayout:
        size_hint_y: None
        height: 30
        Button:
            text: "Cancel"
            on_release: root.cancel()

        Button:
            text: "Save"
            on_release: root.save(filechooser.path, text_input.text)
john
  • 619
  • 9
  • 24

1 Answers1

1

"Python tries to convert a byte-array (a bytes which it assumes to be a utf-8-encoded string) to a unicode string (str). This process of course is a decoding according to utf-8 rules. When it tries this, it encounters a byte sequence which is not allowed in utf-8-encoded strings (namely this 0xff at position 0)."

Source: this answer was helpful

john
  • 619
  • 9
  • 24