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

2.8k Views Asked by At

I can't seem to figure out the syntax for triggering a function upon someone using a FileInput widget in a Parameterized class.

I understand that FileInput isn't a param itself, but I looked at the code for it and the value attribute is a generic param.Parameter, so I thought this would work. I also tried just depending on file (@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()

Then after using the file widget, I would expect my_file.file_data to have the same contents of self.file.value.

panel_output

Appreciate any input or if anyone can point me to appropriate docs. Thanks!

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

1

There are 1 best solutions below

1
On BEST ANSWER

You are right, in this case your 'file' variable needs to be a param, not a panel widget.

All possible options there are for setting available params are here: https://param.pyviz.org/Reference_Manual/param.html

So in your case I used 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()

This FileSelector is however a box to type the filename yourself. This question is related to this and gives some more explanation:
Get a different (non default) widget when using param in parameterized class (holoviz param panel)
So you need to change this FileSelector still to the FileInput widget, by overwriting it like this:

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

Please note that I also added watch=True. This makes sure that changes get picked up, when your 'file' param has changes. There's a bit more explanation of this in the following question:
How do i automatically update a dropdown selection widget when another selection widget is changed? (Python panel pyviz)

Can you let me know if this helped?