Python Plotly Dash和webbrowser模块在仅调用一次时打开两个选项卡

2024-06-02 04:29:37 发布

您现在位置:Python中文网/ 问答频道 /正文

作为标题建议。我有一个文件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()

我拥有的第二个文件(来自破折号中文档的示例)是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本身中,我没有看到任何打开浏览器的调用,事实上,如果我单独运行此代码,它根本不会打开浏览器。本地服务器刚刚启动,这是您所期望的

我错过了什么


Tags: 代码importapphtmlassfexternalchildren
1条回答
网友
1楼 · 发布于 2024-06-02 04:29:37

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

app.run_server(debug=True)

因此,请改为运行:

app.run_server()

或者显式地将debug设置为False


调用run_server时,运行与Dash应用程序(source)关联的Flask服务器

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

所以

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

实际上正在运行多次


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

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

相关问题 更多 >