0

I have the four CSV files stored in local. Each corresponds to some store details which has ItemNumber, ItemName, ItemBrand, and ItemCost.

I am using a Python panel to display the CSV files in a browser after converting the CSV as an interactive data frame. When I execute the code, the app is launched in browser. But when I change the dropdown value, the contents of the webpage is not updated. The error says:

2023-06-16 23:38:24,500 ERROR: panel.reactive - Callback failed for object named "Select File Name" changing property {'value': 'File2'} . OSError: [WinError 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted

I have added some logic to stop the template and start it with the new content each time the drop down value is changed, to prevent the simultaneous use of same port number. But somehow , it is not working. Please help me to fix this issue:

    #!/usr/bin/env python3

    import pandas as pd
    from pathlib import Path
    import panel as pn
    import hvplot.pandas

    fileName = "File1"
    df_file_name = fileName + "_df.csv"
    df_filepath = Path('C:\\Users\\user1\\MyPythonApp\\' + df_file_name)
    serveable = None

    def dfToDisplay(file):
        global serveable  # Access the 'serveable' variable

        # Stop the previous 'servable' if it exists
        if serveable is not None:
            serveable.stop()
            time.sleep(10)
        if type(file) == str:
            filenm = file
        else:
            filenm = file[-2]

        df_path = Path("C:\\Users\\user1\\MyPythonApp\\" + filenm + "_df.csv")
        displayDF = pd.read_csv(df_path)
        interactivedf = displayDF.interactive()
        itable = interactivedf.pipe(pn.widgets.Tabulator, pagination='local', page_size=50, layout='fit_data', theme='default', disabled=True, widths={'index': '70', 'ItemNumber': '130', 'ItemName': '200', 'ItemBrand': '150', 'ItemCost': '900'})
        template = pn.template.FastListTemplate(title='Blah blah Details', sidebar=['Filename', dropdown], logo='https://abccorp.com/logo.svg', main=[itable.panel()])
        serveable = pn.serve(template, port=20001, show=False)

    dropdown = pn.widgets.Select(name='Select File Name', options=['File1', 'File2', 'File3', 'File4'])
    dropdown.param.watch(dfToDisplay, 'value')
    dfToDisplay(fileName)

Application screenshot

I tried it using template.show() method. In this case, each time a new server is launched in a random port numbers. But I need the data across different values of dropdown to be displayed on a fixed port number.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
  • What is "Python panel"? Do you mean the Python module [Panel](https://panel.holoviz.org/) (this is ***not*** covered by the tag "panel")? Or something else? – Peter Mortensen Jun 21 '23 at 13:22
  • Hi @PeterMortensen: Yes. I am using python module Panel, which you can see in the code. Sorry for wrong tag – Thushar Mohan Jun 22 '23 at 14:05

0 Answers0