Простой вопрос с использованием Dash: как отобразить обновленный вывод переменной?

Новичок в Dash, так что терпите.

У меня есть соединение через websocket, которое передает данные Forex на мою консоль; цена, максимум, минимум, символ и т. д.

Я хотел бы, чтобы эта информация отображалась на панели управления, которую можно было бы легко просмотреть, вместо того, чтобы все печатать на моей консоли.

Проблема, с которой я сталкиваюсь, заключается в том, что данные обновляются только при обновлении страницы, когда я хочу, чтобы они обновлялись по мере получения на панели инструментов.

Это мой код для подключения к веб-сокету и создания панели управления:

import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly
from dash.dependencies import Input, Output, State
import fxcmpy
import pandas as pd
import datetime as dt
import time

con = fxcmpy.fxcmpy(access_token = "1111111111111111111111111111111111111111111111212", log_level = 'error')

currenc = ["AUD/CAD", "AUD/CHF", "AUD/JPY", "AUD/NZD", "AUD/USD", "CAD/CHF", "CAD/JPY", "CHF/JPY", "EUR/AUD", "EUR/CAD", "EUR/CHF", "EUR/GBP", "EUR/JPY", "EUR/NZD", "EUR/TRY", "EUR/USD", "GBP/AUD", "GBP/CAD", "GBP/CHF", "GBP/JPY", "GBP/NZD", "GBP/USD", "NZD/CAD", "NZD/CHF", "NZD/JPY", "NZD/USD", "USD/CAD", "USD/JPY"]

app = dash.Dash(__name__)

def print_data(data, dataframe):

    t = pd.to_datetime(int(data['Updated']), unit='ms')
    price = data['Rates'][0]
    symbol = data['Symbol']

    app.layout = html.Div([
        dcc.Textarea(
            id='textprice',
            value=(str(price)),
            style={'width': '100%', 'height': 300},
        ),
        dcc.Textarea(
            id='textsymbol',
            value=(str(symbol)),
            style={'width': '100%', 'height': 300},
        ),
        html.Div(id='textarea-example-output', style={'whiteSpace': 'pre-line'})
    ])

if __name__ == '__main__':
    for i in currenc:
        con.subscribe_market_data(i, (print_data,))
    app.run_server(debug=True)

На панели управления есть два текстовых поля, одно для цены, другое для символа. Я бы хотел, чтобы панель инструментов открывалась и эти значения обновлялись автоматически.

Любая помощь будет оценена по достоинству,


person Ell Jeff    schedule 10.12.2020    source источник


Ответы (1)


Вам нужен компонент Interval. Настройте dcc.Interval на любой желаемый период времени и используйте его в качестве входных данных для функции обратного вызова. Результатом этой функции будут текстовые поля с данными, которые вы хотите обновлять каждый раз, когда обновляется интервал. В основном:

app.layout = html.Div([
    ...
    dcc.Interval(id='my-interval', interval=5000),  # one tick each 5 seconds
    html.Div(id='my-output', children=[]),
    ...
])


@app.callback(Output('my-output', 'children'),
              [Input('my-interval', 'n_intervals')])
def callback_func(interval):
    # make your calls to get the data

    return [html.Div([
        # the data content in here
    ])
person coralvanda    schedule 10.12.2020