我目前正在使用Kivy的FileChooserController来选择文件。当FileChooserController收到系统中找不到的文件路径时,我想执行自己的指定操作(FileNotFoundError)。但是,当我尝试使用"try:"
和"except FileNotFoundError:"
时,程序不会执行我的"except FileNotFoundError:"
下的操作。该程序能够识别异常,但是它没有响应我的“ except FileNotFoundError:
”。有办法解决这个问题吗?
我尝试阅读和理解Kivy的ExceptionHandler和ExceptionManager。但是,我无法将其应用于我的问题。如果您有如何使用这些示例,请提供给我并解释一下。谢谢
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:[错误2]没有这样的文件或目录:'/ 234234'
在收到上述消息之前,我也收到了这些消息。
回溯(最近通话最近):文件 “ /home/kebaranas/miniconda3/lib/python3.6/site-packages/kivy/uix/filechooser.py”, _generate_file_entries中的第828行 用于索引,总数,self中的项。_add_files(path):文件“ /home/kebaranas/miniconda3/lib/python3.6/site-packages/kivy/uix/filechooser.py”, _add_files中的第849行 对于self.file_system.listdir(path)中的f:文件“ /home/kebaranas/miniconda3/lib/python3.6/site-packages/kivy/uix/filechooser.py”, 第168行,在listdir中 返回listdir(fn)
答案 0 :(得分:0)
该异常在调用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 = '/'