首页 > 解决方案 > 如何在 JupyterLab/JupyterHub python notebook 中显示服务器端文件的文件选择对话框?

问题描述

我想显示一个文件选择对话框,我的 JupyterLab 笔记本的用户可以在其中从他们的工作区中选择一个文件(= 服务器上的文件,而不是他们的本地计算机上的文件)。

如果我尝试使用一些 python 库(tkinter、qt),那将尝试在服务器上打开一个 GUI。但是,我想在客户端上有一个 GUI。由于客户端在浏览器中运行,因此该 GUI 需要基于 html/javascript。

此外,要选择的文件位于服务器上。可以使用系统命令(例如“!dir”)显示现有文件的列表。

JupyterLab 中似乎有用于文件选择的小部件:

https://jupyterlab.readthedocs.io/en/stable/developer/ui_helpers.html#file-dialogs

JavaScript 代码(需要 Jupyterlab 扩展的构建步骤;FileDialog需要从 @jupyterlab/filebrowser 导入;DocumentManager 需要作为插件依赖从 @jupyterlab/docmanager 注入;):

var { FileDialog } = require('@jupyterlab/filebrowser');

const dialog = FileDialog.getOpenFiles({
  manager, // IDocumentManager
  filter: model => model.type == 'notebook' // optional (model: Contents.IModel) => boolean
});

const result = await dialog;

if(result.button.accept){
  let files = result.value;
}

=>如何在我的 python 代码中使用这些小部件?是否有一些额外的 python 库可以这样做?

不幸的是FileDialog,似乎没有包含在ipywidgets

import ipywidgets as widgets
print(dir(widgets))

有关的:

https://discourse.jupyter.org/t/jupyterlab-file-chooser-widget-server-side/4934/3

ipywidgets

qt 和 tkinter

标签: pythonjupyter-lab

解决方案


作为一种解决方法,有https://pypi.org/project/ipyfilechooser/

文件选择不会显示为额外的对话框窗口,而是显示在笔记本单元格的输出区域中,另请参阅:

https://github.com/crahan/ipyfilechooser/issues/31

安装:

pip install ipyfilechooser

用法:

from ipyfilechooser import FileChooser

fc = FileChooser()
display(fc)

fc.selected

推荐阅读