Search code examples
pythonkivyworking-directory

How can I know the working directory under FileChooserListView structure if no file is selected


I am new to python kivy, recently I am using kivy to build up my android app, the question is below:

I am using the FileChooserListView to show all the file system in the my boxlayout, I know that when I select one or more file, I can use some_filechooser.path to obtain the current working directory.

test.kivy

BoxLayout:
    size: root.size
    pos: root.pos
    orientation: "vertical"
    FileChooserListView:
        id: filechooser
        path: "./"
        on_selection: root.selected(filechooser.path)

Afther I touch/click/select one file, on_selection: root.selected(filechooser.path) is executed to obatain the current path of the selected file, but can I do the same thing even if no file is selected. Thanks for all your help


Solution

  • Use filechooser.path to display the current working directory when no file is selected.

    Snippet

            BoxLayout:
                Label:
                    text: 'Working Directory:'
                Label:
                    text: filechooser.path
    

    FileChooser » Path

    path

    path is a StringProperty and defaults to the current working directory as a unicode string. It specifies the path on the filesystem that this controller should refer to.

    You can do the following:

    Example

    main.py

    from kivy.app import App
    from kivy.uix.floatlayout import FloatLayout
    from kivy.properties import ObjectProperty
    from kivy.uix.popup import Popup
    from kivy.lang.builder import Builder
    
    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):
    
        def build(self):
            return Builder.load_file('main.kv')
    
    
    if __name__ == '__main__':
        Editor().run()
    

    main.kv

    #:kivy 1.11.0
    
    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:
                orientation: 'vertical'
                size_hint_y: None
                height: 90
    
                BoxLayout:
                    Label:
                        text: 'Working Directory:'
                    Label:
                        text: filechooser.path
    
                BoxLayout:
                    Label:
                        text: 'Filename:'
                    Label:
                        text: ''.join(map(str, filechooser.selection))
    
                BoxLayout:
                    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)
    

    Output

    FileChooser - path