使用param.Parameterized构建Panel应用时如何获取上传文件名?
解决Panel+param获取上传文件名的问题
问题原因
param.FileSelector本身是为本地文件路径选择设计的,当你将它与pn.widgets.FileInput组件绑定时,file_upload参数接收的是文件的字节数据,而非文件名或路径,因此无法直接从参数值中提取文件名。
方案一:保存外部生成的Widget引用
不需要在类内部创建Widget,只需保存pn.Param生成的FileInput实例引用,即可在update_name方法中访问文件名:
import panel as pn import param pn.extension() class TestFile(param.Parameterized): file_upload = param.FileSelector() file_name = param.String() def __init__(self, **params): super().__init__(**params) self.file_input_widget = None @param.depends("file_upload", watch=True) def update_name(self): if self.file_input_widget and self.file_input_widget.filename: self.file_name = self.file_input_widget.filename test = TestFile() # 创建Param面板并获取内部的FileInput组件 param_panel = pn.Param(test.param, widgets={"file_upload": {"type": pn.widgets.FileInput}}) test.file_input_widget = param_panel[0] app = pn.Row(param_panel) app.servable()
方案二:通过Panel文档对象查找Widget
改用通用param.Parameter接收文件字节,再通过Panel的文档对象定位到FileInput组件获取文件名,无需保存组件引用:
import panel as pn import param pn.extension() class TestFile(param.Parameterized): file_upload = param.Parameter() file_name = param.String() @param.depends("file_upload", watch=True) def update_name(self): # 遍历文档根组件,匹配目标FileInput for widget in pn.state.curdoc.roots[0].select(pn.widgets.FileInput): if widget.name == "file_upload": self.file_name = widget.filename break test = TestFile() app = pn.Row(pn.Param(test.param, widgets={"file_upload": {"type": pn.widgets.FileInput}})) app.servable()
内容的提问来源于stack exchange,提问作者SultanOrazbayev
相关产品推荐
相关产品推荐

