Plotly-Dash: агрегирование входов и выходов для отражения сложных объектов Python - PullRequest
0 голосов
/ 19 июня 2019

Как я могу использовать совокупность нескольких элементов HTML для обозначения объекта.

Например, скажем, у меня был объект python с именем TaggedCoordinates, экземпляры которого имели атрибуты t.x, t.y и t.tag. Если бы я хотел отобразить такой экземпляр на странице или иметь форму, чтобы попросить пользователя ввести один, я бы использовал два числовых элемента для x и y и строковый элемент для тега. При обратном звонке у меня будет что-то вроде

@callback(..., [...], [State(x_id), State(y_id), State(tag_id)])
def store_tagged_coordinate(x, y, tag):
    …

Но я бы предпочел что-то вроде:

@callback(..., [...], [State(tag_coord_id)])
def store_tagged_coordinate(tag_coord):
    …

Как мне достичь чего-то подобного? Я мог бы сгруппировать html-элементы в div с определенным идентификатором (скажем, tag_coord_id), но как тогда заставить dash понять, что я хочу получить "struct" или dict его составляющих как одну переменную python tag_coord .

1 Ответ

0 голосов
/ 20 июня 2019

Вот возможное решение (но подождем, чтобы увидеть, есть ли лучшее).

Напишите функцию-конвертер, которая преобразует div, который группирует относящиеся к объекту html-элементы, затем используйте его вфункция обратного вызова.Вот так:

from dataclasses import dataclass

@dataclass
class TaggedCoord:
    x: float
    y: float
    tag: str

def obj_for_div(d):
    return TaggedCoord(*[c.value for c in d.children])

Тогда, если у вас есть, в вашем макете, что-то вроде:

import dash_core_components as dcc
import dash_html_components as html
d = html.Div(children=[dcc.Input(id='x', value=0, type='number'), 
                       dcc.Input(id='y', value=0, type='number'), 
                       dcc.Input(id='tag', value='', type='text')],
      id='tagged_coord')
@callback(..., [...], [State(tag_coord_id)])
def store_tagged_coordinate(..., tag_coord):
    tag_coord = obj_for_div(tag_coord)
    ...

Смотрите, что

>>> obj_for_div(d)
TaggedCoord(x=0, y=0, tag='')
...