Как я могу обработать исключения FileNotFoundError для Kivy FileChooserController - PullRequest
0 голосов
/ 28 апреля 2019

В настоящее время я использую FileChooserController от Kivy при выборе файла. Я хочу сделать свое собственное указанное действие, когда FileChooserController получает путь к файлу, который не найден в системе (FileNotFoundError). Однако, когда я попытался использовать "try:" и "except FileNotFoundError:", программа не выполняет действия под моим "except FileNotFoundError:". Программа смогла определить исключение, однако она не отвечает на мои "except FileNotFoundError:". Есть ли способ решить эту проблему?

Я попытался прочитать и понять ExceptionHandler и ExceptionManager в Kivy. Однако я не могу применить это к моей проблеме. И если у вас есть пример того, как их использовать, вы можете предоставить мне и объяснить. Спасибо

https://kivy.org/doc/stable/api-kivy.base.html?highlight=exceptionhandler#kivy.base.ExceptionHandler

.py код

class Browse(Popup):
    title = StringProperty('BROWSE')
    path = StringProperty('/')
    filters = ListProperty(['*.csv'])
    callback = ObjectProperty()

    def __init__(self, callback, path, *args, **kwargs):
        super().__init__(*args, **kwargs) 
        self.callback = callback
        try: 
            self.path = path
        except FileNotFoundError:
            popup = Message(title='ERROR', 
            message='Path not found. Returning to root folder.')
            popup.open()
            print('opened')
            self.path = '/'

.kv код

<Browse>:
    size_hint: None, None
    size: 474, 474
    BoxLayout:
        orientation: 'vertical'
        FileChooserIconView:
            id: filechooser
            filters: root.filters
            path: root.path
            on_submit: root.select(self.selection)
        GridLayout:
            size_hint: None, None,
            size: root.width - 25, 45
            cols: 4
            rows: 1
            Widget:
            Widget:
            Button:
                text: 'SELECT'
                background_normal: 'assets/theme/positive.png'
                background_down: 'assets/theme/positive_pressed.png'
                on_release: root.select(filechooser.selection)

Консоль показывает это сообщение, когда я пытаюсь ввести неверный путь к файлу.

[ОШИБКА] Невозможно открыть каталог

Это также показывает это сообщение, указывающее, что есть FileNotFoundError.

FileNotFoundError: [Errno 2] Нет такого файла или каталога: '/ 234234'

Перед сообщением выше я тоже получаю эти сообщения.

Traceback (последний вызов был последним): File "/Home/kebaranas/miniconda3/lib/python3.6/site-packages/kivy/uix/filechooser.py", строка 828, в _generate_file_entries для индекса, всего, элемент в self._add_files (путь): файл "/home/kebaranas/miniconda3/lib/python3.6/site-packages/kivy/uix/filechooser.py", строка 849, в _add_files для f в self.file_system.listdir (путь): файл "/home/kebaranas/miniconda3/lib/python3.6/site-packages/kivy/uix/filechooser.py", строка 168, в listdir возвращение listdir (fn)

1 Ответ

1 голос
/ 28 апреля 2019

Это исключение выбрасывается внутрь FileChooserController внутри метода генератора, который вызывает FileSystem метод listdir().Я полагаю, что вам нужно было бы создать подкласс FileChooserIconView и заменить часть его кода, чтобы перехватить это исключение.Более простой подход заключается в том, чтобы не создавать это исключение.Для этого просто измените ваш метод __init__ класса Browse:

class Browse(Popup):
    title = StringProperty('BROWSE')
    path = StringProperty('/abba')
    filters = ListProperty(['*.csv'])
    callback = ObjectProperty()

    def __init__(self, callback, path, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.callback = callback
        if os.path.exists(path):
            self.path = path
        else:
            # this would throw the exception
            print('path does not exist')
            self.path = '/'
...