如何将布局更新到 Python Dash 应用程序中

Posted

技术标签:

【中文标题】如何将布局更新到 Python Dash 应用程序中【英文标题】:How to update a layout into a Python Dash application 【发布时间】:2021-10-08 18:39:36 【问题描述】:

我是 Python 和 Dash 的新手,我不知道如何强制我的应用程序在不使用回调的情况下刷新显示的布局;这是我的代码:

AppMain.py

app.layout = html.Div(
children=[
    dcc.Location(
        id=ID_URL,
        refresh=False
    ),
    html.Div(
        [
            dcc.Link(
                'Test',
                href=HREF_PAGE_TEST,
            ),
            dcc.Link(
                'Single',
                href=HREF_PAGE_SINGLE,
            ),
            dcc.Link(
                'Common',
                href=HREF_PAGE_COMMON,
            ),
        ]
    ),
    html.Div(
        id=ID_PAGE_CONTAINER,
    ),
),


@app.callback(
     Output(ID_PAGE_CONTAINER, 'children'),
     [Input(ID_URL, 'pathname')],
)
def clickOnPageToShow(pathname):
     return findPageToShow(pathname)

def findPageToShow(pathname):
    if pathname == HREF_PAGE_TEST:
        PageTest.data_frame = shared_data_frame
        return PageTest.layout

    elif pathname == HREF_PAGE_SINGLE:
        PageSingle.data_frame = shared_data_frame
        return PageSingle.layout

    elif pathname == HREF_PAGE_COMMON:
        PageCommon.data_frame = shared_data_frame
        return PageCommon.layout

    return ""

每个页面都建立自己的布局,用户点击相关的 dcc.Link 选择显示哪一个;此过程运行良好,用户可以随时更改页面。

我现在想要以编程方式构建和显示 PageSingle,所以我尝试添加:

AppMain.showPageSingle()

def showPageSingle():
    page = findPageToShow(HREF_PAGE_SINGLE)
    app.layout[ID_PAGE_CONTAINER].children = [page]
    #app.layout[ID_PAGE_CONTAINER].children = page

但是什么也没发生。

我做错了什么? 谢谢

编辑

如何建议我使用单击创建到页面中的表格单元格时引发的回调Common

PageCommon.py

@app.callback(
    Output(ID_PAGE_CONTAINER, 'children'),
    [
        Input(ID_TABLE_COMMON, 'active_cell'),
        Input(ID_TABLE_COMMON, 'data')
    ]
)
def clickOnCell(active_cell, data_table):

    if active_cell is not None:
        row_index = active_cell['row']
        col_index = active_cell['column']

        import AppMain
        return AppMain.buildPageSingle()

    return []

但是在这种情况下,当我选择页面时应用程序没有响应,可能是因为回调无效。

【问题讨论】:

【参考方案1】:

您可以通过这种方式(在您的布局中)添加“间隔”组件:

   dcc.Interval(
            id='interval-component',
            interval=60 * 1000,  # in milliseconds , 20 seconds every refresh
            n_intervals=0

然后,您可以引用该组件。

@app.callback(Output('live-update-time', 'children'),
             [Input('interval-component', 'n_intervals')])

def update_time(n):
    current_time = datetime.datetime.now()
    return html.P(f"Last Update at current_time ")
           

在上面的示例中,我每 20 秒刷新一次页面。

【讨论】:

您好,谢谢。我见过这种解决方案,但我不想定期刷新页面;仅当用户执行某些操作时才必须进行此更新。 如果您需要参考用户的操作,您可能需要回调...... 是的,我编辑了问题来解释我的回调问题

以上是关于如何将布局更新到 Python Dash 应用程序中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Dash 中更新侧边栏布局?

如何在 python Dash 中访问应用布局中的输入值?

如何将 x-scrollbar 添加到 dbc.Card、dash、Python3 的一部分?

如何在单个浏览器页面上向 Dash 应用程序添加多个图表?

Dash:如何更新回调中的数百个元素?

如何在具有多个唯一图形的布局上实现 Dash/Plotly 清单持久性?