首页 > 解决方案 > Python - Plotly Dash 和 webbrowser 模块仅在调用一次时打开两个选项卡

问题描述

作为标题建议。我有一个文件main.py

import dashApp
from threading import Timer
import webbrowser


if __name__ == "__main__":
    Timer(10, webbrowser.open_new("http://127.0.0.1:8050/")).start()
    dashApp.dashApp()

我拥有的第二个文件(来自 Dash 文档的示例)是dashApp.py

import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.express as px
import pandas as pd

def dashApp():
    external_stylesheets = ["https://codepen.io/chriddyp/pen/bWLwgP.css"]

    app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

    # assume you have a "long-form" data frame
    # see https://plotly.com/python/px-arguments/ for more options
    df = pd.DataFrame(
        {
            "Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
            "Amount": [4, 1, 2, 2, 4, 5],
            "City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"],
        }
    )

    fig = px.bar(df, x="Fruit", y="Amount", color="City", barmode="group")

    app.layout = html.Div(
        children=[
            html.H1(children="Hello Dash"),
            html.Div(
                children="""
            Dash: A web application framework for Python.
        """
            ),
            dcc.Graph(id="example-graph", figure=fig),
        ]
    )
    app.run_server(debug=True)

当我运行代码时,无论我尝试什么,它都会打开同一本地主机的两个选项卡。我认为这是一个时间问题,因此让 Dash 启动需要 10 秒的延迟。但它不管延迟打开两个选项卡。如果我只运行webbrowser打开说 google.com 的代码,它只会打开一个。

就其dashApp本身而言,我看不到任何打开浏览器的调用,事实上,如果我单独运行此代码,它根本不会打开浏览器。本地服务器刚刚启动是您所期望的。

我错过了什么?

标签: pythonbrowserplotlyplotly-dash

解决方案


我认为问题在于您正在debug模式下运行 Dash 应用程序:

app.run_server(debug=True)

所以改为运行:

app.run_server()

或明确debug设置。False


当你打电话时,run_server你运行Flask与你的 Dash 应用程序关联的服务器(

它运行两次的原因是 Werkzeug 重新加载器处于活动状态,并且它产生了一个子进程来监视代码更改。如果您在应用程序运行时更改部分代码,您会注意到每次保存的更改都会打开另一个选项卡。有关更多信息,请参阅这篇文章

所以

Timer(10, webbrowser.open_new("http://127.0.0.1:8050/")).start()

实际上正在运行多次。


或者,您可以保留debug=True,但禁用重新加载器:

app.run_server(debug=True, use_reloader=False)

推荐阅读