Panel + Param:FileInput 小部件和@param.depends 交互

Panel + Param: FileInput widget and @param.depends interaction

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

我知道 FileInput 本身不是参数,但我查看了它的代码,发现值属性是通用的 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 相同的内容。

panel_output

感谢任何意见或任何人都可以指出适当的文档。谢谢!

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

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

用于设置可用参数的所有可能选项都在这里: 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 是一个可以自己输入文件名的框。这个问题与此相关并给出了更多解释:

所以你需要将这个 FileSelector 仍然更改为 FileInput 小部件,通过这样覆盖它:

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

请注意,我还添加了 watch=True。当您的 'file' 参数发生变化时,这可以确保更改被拾取。在以下问题中对此有更多解释:

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