IPython Notebook:使用GUI打开/选择文件(Qt对话框)

当您在笔记本上对不同的数据文件执行相同的分析时,可能会很方便地以图形方式选择一个数据文件。

在我的Python脚本中,我通常实现一个QT对话框,它返回所选文件的文件名:

from PySide import QtCore, QtGui

def gui_fname(dir=None):
    """Select a file via a dialog and return the file name.
    """
    if dir is None: dir ='./'
    fname = QtGui.QFileDialog.getOpenFileName(None, "Select data file...", 
            dir, filter="All files (*);; SM Files (*.sm)")
    return fname[0]

但是,从笔记本运行此功能

full_fname = gui_fname()

导致内核死亡(并重新启动):

有趣的是,在3个单独的单元格中将这3个命令拼凑起来

%matplotlib qt
full_fname = gui_fname()
%matplotlib inline

但是当我把这些命令放在一个单独的单元中时,内核再次死亡。

这可以防止创建一个像gui_fname_ipynb()这样的函数,它透明地允许用GUI选择文件。

为了方便起见,我创建了一个说明问题的笔记本:

  • 用GUI打开/选择文件(Qt对话框)
  • 有关如何在IPython Notebook中执行文件选择对话框的任何建议?


    这种行为是IPython中的一个错误:

    https://github.com/ipython/ipython/issues/4997

    这是固定在这里:

    https://github.com/ipython/ipython/pull/5077

    打开gui对话框的功能应该适用于当前的主控和即将发布的2.0版本。

    到目前为止,最新的1.x版本(1.2.1) 包含修复的后退端口。

    编辑:示例代码仍然崩溃IPython 2.x,请参阅此问题。


    在windows(Python 3.6.2,IPython 6.1.0)上使用Anaconda 5.0.0,以下两个选项都适用于我。

    选项1:完全在Jupyter笔记本中:

    CELL 1:

    %gui qt
    
    from PyQt5.QtWidgets import QFileDialog
    
    def gui_fname(dir=None):
        """Select a file via a dialog and return the file name."""
        if dir is None: dir ='./'
        fname = QFileDialog.getOpenFileName(None, "Select data file...", 
                    dir, filter="All files (*);; SM Files (*.sm)")
        return fname[0]
    

    小区2:

    gui_fname()
    

    这对我有用,但似乎有点脆弱。 如果我将这两件事合并到同一个单元中,它就会崩溃。 或者如果我省略%gui qt ,它会崩溃。 如果我“重新启动内核并运行所有单元”,它不起作用。 所以我有点喜欢这个其他的选择...

    更可靠的选项:独立的脚本,可在新过程中打开对话框

    (基于这里的mkrog代码。)

    将以下内容放入单独的脚本中: blah.py

    from sys import executable, argv
    from subprocess import check_output
    from PyQt5.QtWidgets import QFileDialog, QApplication
    
    def gui_fname(directory='./'):
        """Open a file dialog, starting in the given directory, and return
        the chosen filename"""
        # run this exact file in a separate process, and grab the result
        file = check_output([executable, __file__, directory])
        return file.strip()
    
    if __name__ == "__main__":
        directory = argv[1]
        app = QApplication([directory])
        fname = QFileDialog.getOpenFileName(None, "Select a file...", 
                directory, filter="All files (*)")
        print(fname[0])
    

    ...在JUPYTER NOTEBOOK中

    import blah
    blah.gui_fname()
    
    链接地址: http://www.djcxy.com/p/18089.html

    上一篇: IPython Notebook: Open/select file with GUI (Qt Dialog)

    下一篇: Contenteditable tag continuation