6

我似乎无法弄清楚在参数化类中使用 FileInput 小部件触发函数的语法。

我知道 FileInput 本身不是参数,但我查看了它的代码,并且 value 属性是一个通用的 param.Parameter,所以我认为这会起作用。我也尝试过仅取决于文件(@param.depends('file'))。

class MyFile(param.Parameterized):
    file = pn.widgets.FileInput() # should be a param.?
    file_data = None
    
    @param.depends('file.value')
    def process_file(self):
        print('processing file')
        self.file_data = self.file.value

my_file = MyFile()

然后在使用文件小部件后,我希望my_file.file_data有相同的内容self.file.value

面板输出

感谢任何输入,或者是否有人可以将我指向适当的文档。谢谢!

https://github.com/pyviz/panel/issues/711

4

1 回答 1

6

你是对的,在这种情况下,你的 'file' 变量需要是一个 param,而不是一个面板小部件。

用于设置可用参数的所有可能选项都在这里: https ://param.pyviz.org/Reference_Manual/param.html

因此,在您的情况下,我使用了 param.FileSelector()

import param
import panel as pn

pn.extension()    


class MyFile(param.Parameterized):
    file = param.FileSelector()  # changed this into a param
    file_data = None

    @param.depends('file', watch=True)  # removed .value and added watch=True
    def process_file(self):
        print('processing file')
        self.file_data = self.file  # removed .value since this is a param so it's not needed

my_file = MyFile()

然而,这个 FileSelector 是一个可以自己输入文件名的框。这个问题与此相关并给出了更多解释:
Get a different (non default) widget when using param in parameterized class (holoviz param panel)
因此,您需要将这个 FileSelector 更改为 FileInput 小部件,方法是像这样覆盖它:

pn.Param(
    my_file.param['file'], 
    widgets={'file': pn.widgets.FileInput}
)

请注意,我还添加了watch=True。这可以确保在您的“文件”参数发生更改时获取更改。以下问题对此有更多解释:
如何在更改另一个选择小部件时自动更新下拉选择小部件?(Python面板pyviz)

你能告诉我这是否有帮助吗?

于 2019-10-16T19:34:14.027 回答