Dash+Plotly | Web应用开发(1)

本文为https://github.com/CNFeffery/DataScienceStudyNotes的学习笔记,部分源码来源于此仓库。
本期内容主要为基础概念web布局方法交互回调

文章目录

    • Dash的主要模块
    • Highlight
    • layout
    • callback
      • 惰性交互
      • 阻止初次回调
      • 忽略回调匹配错误
      • 控制部分回调输出不更新
      • 获取本轮回调的输入信息
      • 浏览器端执行回调

Dash的主要模块

  • dash.dcc(Dash Core Components)和dash_bootstrap_components提供核心的components,如按钮、下拉菜单等。
  • dash.html是对html标记语言的Python封装。可以将dccdbc中的组件放入html容器中
  • dash.Inputdash.Output是进行callback的必用组件
  • plotly.expressplotly.graph_objects是plotly的绘图库。一般将plotly画好的图像对象传入dcc.Graph()figure参数中。dcc.Graph()是dash渲染可交互图像的方法。
  • dash.dash_tabel是展示表格的对象,具有类似excel的功能。
import dash
from dash import Dash, html, dash_table, dcc, Input, Output
import dash_bootstrap_components as dbc
import plotly.express as px
import plotly.graph_objects as go

Highlight

  • layout: layout负责呈现前端的页面的布局,一般为dash.html模块中的对象。通过传入多个元素或多层嵌套,可以构建更复杂的页面内容。
  • callback: callback负责处理后端的数据交互。一般使用装饰器的形式,实现前后端异步通信交互。
  • 静态/交互部件: 静态部件主要为html中的组件,比如分割线静态图片等等。可交互的组件一般为dccdbc中的部件,它们通过callback实现通信交互。这些组件通过layout组织在一起,共同组成完整的Dash应用。
  • plotly图像: 理论上其他图像也可以放入Dash应用中,但作为Dash一奶同胞的兄弟,plotly天生可与Dash完美融合。
# 第一个Dash应用
# 展示一个Dash应用最基本的流程:实例化、添加组件、启动应用(实际上还有回调,后面会看到)from dash import Dash
import dash_html_components as html
import webbrowser# Dash实例化,所有Dash应用都应当如此
app = Dash(__name__,  # __name__不能省略external_stylesheets=['css/bootstrap.min.css']  # 规定了CSS的样式,这行是可选的)  app.layout = html.H1("第一个Dash应用")  # 在布局中添加组件if __name__ == '__main__':webbrowser.open("http://127.0.0.1:8050")  # 自动打开web应用。这句不是必须的,你可以手动打开。app.run_server()  # 启动你的Dash服务,在浏览器中打开http://127.0.0.1:8050/可以看到你的web页面。# 在终端中按下CTRL+C关闭服务

layout

dbc.Container()是组织页面布局的容器,它将页面看作N行12列的表格布局,通过设置component占多少列来设置组件的宽度。

行部件dbc.Row()组成列表传入dbc.Container()中,按照列表顺序从上至下排列。

列部件dbc.Col()组成列表传入行部件dbc.Row()中,按照列表顺序从左至右排列。

一个dbc.Row()中的部件宽度正好为12时充满整行,

小于12时右侧则会空出剩余的宽度,

大于12时将溢出的部件挤到下一行。

总而言之,嵌套等级为:Container() > Row() > Col()。如下所示:

app.layout = dbc.Container([dbc.Row(dbc.Col(html.Div("A single column"))),dbc.Row([dbc.Col(html.Div("One of three columns"),width=4),dbc.Col(html.Div("One of three columns"),width=4),dbc.Col(html.Div("One of three columns"),width=4),]),]
)

展示的效果:

img

ps:以上示例是官网展示的效果,但实际运行并未如期运行。知道原因大佬请指教。

  1. dbc.Row()可接受的常用参数还有justify,表示同一行的多个列元素设置对齐方式,可选项有'start''center''end''between'以及'around'五种

  2. dbc.Col()可接受的常用参数还有以下两个:

  • order: 代表同一个Row下的顺序。可接受的输入为:fristlast和1到12的整数,分别表示第一个,第十二个,和一到十二的任意一个位置。
  • offset: 代表对应Col()部件左侧增加对应的宽度,可接受的参数为1到12。

callback

每个component都有id,这是这个component的唯一索引。

callback一定是多个components之间的响应(有输入组件和输出组件),通过先输出,后输入的顺序传入对象。

  • 单个输入输出直接传入参数。
  • 多个输出输出,组成列表后再传入参数。只要有一个输入变化就会触发回调。

如下所示:

import dash
import dash_html_components as html
import dash_bootstrap_components as dbc
from dash.dependencies import Input, Outputapp = dash.Dash(__name__,external_stylesheets=['css/bootstrap.min.css']
)app.layout = html.Div([html.Br(),html.Br(),html.Br(),dbc.Container([dbc.Row([dbc.Col(dbc.Input(id='input-lastname'), width=3),dbc.Col(html.P('+'), width=1),dbc.Col(dbc.Input(id='input-firstname'), width=3),],justify='start'),html.Hr(),dbc.Label(id='output1'),html.Br(),dbc.Label(id='output2')])]
)# 回调以装饰器的形式声明
@app.callback([Output('output1', 'children'),  # 多输出时用列表的形式传入,单输出则可以直接传入。Output('output2', 'children')],  # Output中第一个参数为输出组件id,第二参数为做出响应的属性。[Input('input-lastname', 'value'),  # 多输入时用列表的形式传入,单输入则可以直接传入。Input('input-firstname', 'value')]  # Iutput中第一个参数为输出组件id,第二参数为需要监控的属性。
)
def input_to_output(lastname, firstname):  # 这里定义回调函数的具体内容try:return '完整姓名:' + lastname + firstname, f'姓名长度为{len(lastname+firstname)}'except:return '等待输入...', '等待输入...'  # 注意返回值,不是列表形式,多个元素直接返回即可if __name__ == '__main__':app.run_server()

惰性交互

以上的例子中,只要输入部件属性改变,回调函数会立马触发。

但有时我们不希望回调函数立马触发,而是在我们一声号令后(比如按下某个按钮),回调函数再触发,这样的回调称为惰性交互。

惰性交互实现非常简单,在callback中增加State()对象,如下所示:

import dash
import dash_html_components as html
import dash_bootstrap_components as dbc
from dash.dependencies import Input, Output, State# 其余部分省略...@app.callback(Output('output-value', 'children'),Input('state-button', 'n_clicks'),  # 注意这里Input中的id是触发按钮。State('input-value', 'value')  # State中的id才是真正输入组件的id,# 相当于State替换了立即回调模式中的Input。
)
def input_to_output(n_clicks, value):if n_clicks:return value.upper()# 其余部分省略....

阻止初次回调

初次回调一般跟输入框有关系。因为首次打开的网页输入框都是空的,如果回调函数不支持空的输入就会产生错误。

callback中设置prevent_initial_call=True即可阻止初始回调,避免错误。

# 其余部分省略
@app.callback(Output('output1', 'children'),Input('input1', 'value'),prevent_initial_call=True  # 阻止初次回调
)
def callback1(value):return int(value) ** 2

忽略回调匹配错误

在很多时候,我们需要在发生某些交互回调时,才创建一些具有指定id的部件,如果在初始化时触发了回调,则会发生错误。

callback中设置suppress_callback_exceptions=True即可忽略回调时的id匹配错误,避免错误。

@app.callback(Output('output_desc', 'children'),Input('output_dropdown', 'options'),prevent_initial_call=True  # 忽略回调匹配错误
)
def callback2(options):pass

控制部分回调输出不更新

dash.no_update作为Output()的返回值,则对应的组件属性就不会更新。如:

# 其余部分省略@app.callback([Output('record-1', 'children'),Output('record-2', 'children'),Output('record-n', 'children'),],Input('button', 'n_clicks'),prevent_initial_call=True
)
def record_click_event(n_clicks):if n_clicks == 1:return ('第1次点击:{}'.format(time.strftime('%H:%M:%S', time.localtime(time.time()))),dash.no_update,  # 第1次点击, 2和3不参与回调dash.no_update)elif n_clicks == 2:return (dash.no_update,  # 第2次点击, 1和3不参与回调'第2次点击:{}'.format(time.strftime('%H:%M:%S', time.localtime(time.time()))),dash.no_update)elif n_clicks >= 3:return (dash.no_update,  # 3次及以上点击, 1和2不参与回调dash.no_update,'第3次及以上点击:{}'.format(time.strftime('%H:%M:%S', time.localtime(time.time()))),)

获取本轮回调的输入信息

多个输入的回调,一个输入部件就会触发回调。若想知道是哪个输入触发了回调,就要使用dash.callback_context

  • dash.callback_context.triggered: 字典;触发本轮回调组件的id和属性。
  • dash.callback_context.inputs: 字典;所有输入组件目前的id和属性。
@app.callback([Output('A-output', 'children'),Output('B-output', 'children'),Output('C-output', 'children'),Output('raw-json', 'children')],[Input('A', 'n_clicks'),Input('B', 'n_clicks'),Input('C', 'n_clicks')],prevent_initial_call=True
)
def refresh_output(A_n_clicks, B_n_clicks, C_n_clicks):# 获取本轮回调状态下的上下文信息ctx = dash.callback_context# 取出对应State、最近一次触发部件以及Input信息ctx_msg = json.dumps({'states': ctx.states,'triggered': ctx.triggered,'inputs': ctx.inputs}, indent=2)return A_n_clicks, B_n_clicks, C_n_clicks, ctx_msg

浏览器端执行回调

以上的回调是由服务器运算的,频繁触发会增加服务器压力。因此可以使用clientside_callbackClientsideFunction运行js脚本来将计算转移到浏览器端。示例省略(因为我不会JS)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/603106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【总线接口】1.以Xilinx开发板为例,直观的认识硬件板卡和接口

初接触硬件,五花八门的总线、接口一定会让你有些疑惑,我尝试用一系列文章来解开你的疑惑 系列文章 【总线接口】1.以Xilinx开发板为例,直观的认识硬件接口 【总线接口】2.学习硬件这些年接触过的硬件接口、总线 大汇总 【总线接口】…

【STM32】STM32学习笔记-DMA数据转运+AD多通道(24)

00. 目录 文章目录 00. 目录01. DMA简介02. DMA相关API2.1 DMA_Init2.2 DMA_InitTypeDef2.3 DMA_Cmd2.4 DMA_SetCurrDataCounter2.5 DMA_GetFlagStatus2.6 DMA_ClearFlag 03. DMA数据单通道接线图04. DMA数据单通道示例05. DMA数据多通道接线图06. DMA数据多通道示例一07. DMA数…

关于一个热成像仪的总结(一)硬件篇电源电路

1、电源部分 电源部分电路原理是这样的通过3.7V的锂电池供电,用Type-C选用TP4056作为充电电路给电池充电。使用MP2161开关电源作为5转3.3V 电源为MCU供电。 1-1电池 待定 1-2充电管理芯片TP4056 参考datasheet:https://atta.szlcsc.com/upload/publi…

数据传输:连接数字世界的纽带

在当今数字化时代,数据传输已经成为了我们日常生活和工作中不可或缺的一部分。无论是通过互联网发送电子邮件、传输文件,还是在智能手机上浏览网页、观看视频,都离不开数据传输的支持。本文将对数据传输进行深度分析,探讨其原理、…

Vue 3中toRaw和markRaw的使用

Vue 3的响应性系统 在Vue 3中,响应性系统是构建动态Web应用程序的关键部分。Vue使用响应性系统来跟踪依赖关系,使数据更改能够自动更新视图。这使得Vue应用程序在数据变化时能够高效地更新DOM。Vue 3引入了新的Proxy对象来替代Vue 2中的Object.definePro…

vue3+echart绘制中国地图并根据后端返回的坐标实现涟漪动画效果

1.效果图 2.前期准备 main.js app.use(BaiduMap, {// ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */ak: sRDDfAKpCSG5iF1rvwph4Q95M6tDCApL,// v:3.0, // 默认使用3.0// type: WebGL // ||API 默认API (使用此模式 BMapBMapGL) });i…

CSDN博客重新更新

说来惭愧,好久没更新博客文章,导致个人博客网站:https://lenky.info/ 所在的网络空间和域名都过期了都没发觉,直到有个同事在Dim上问我我的个人博客为啥打不开了。。。幸好之前有做整站备份,后续慢慢把内容都迁回CSDN上…

学习笔记——C++运算符之比较运算符

作用&#xff1a;用于表达式的比较&#xff0c;并返回一个真值或假值 比较运算符有以下符号&#xff1a; #include<bits/stdc.h> using namespace std; int main(){//int a10;int b20;cout<<(ab)<<endl;//0//!cout<<(a!b)<<endl;//1//>cout&…

第十二章 编写测试报告/项目总结(笔记)

一、编写测试报告 测试报告的侧重点是什么&#xff1f; 结果分析 1.bug数据统计&#xff0c;bug状态&#xff0c;bug严重级别统计&#xff0c;测试各阶段统计 2.需求覆盖率&#xff0c;用例数&#xff0c;用例执行率&#xff0c;通过率&#xff0c;bug关闭率&#xff0c;bug遗…

CSS实现瀑布流

column 多行布局实现瀑布流 1.column 实现瀑布流主要依赖两个属性。 2.column-count 属性&#xff0c;是控制屏幕分为多少列。 3.column-gap 属性&#xff0c;是控制列与列之间的距离。 <!DOCTYPE html> <html lang"en"> <head><meta charset&q…

链 表

3_1 删除链表中的节点 Answer-将被删节点下一个val复制到待删除节点&#xff0c;然后将待删节点直接连接到下下一个节点即可。 学到&#xff1a; /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) …

The most simple way to use Postman

Open Postman: Launch the Postman app.Create a Request: Click on the “New” button, then select “Request”. This creates a new tab for a request.Set Request Type to POST: On the new request tab, you’ll see a dropdown menu next to the URL field. Select “…

第十天:信息打点-APPamp;小程序篇amp;抓包封包amp;XP框架amp;反编译amp;资产提取

信息打点-APP&小程序 一、内在收集-代码 从app代码中去收集 1、移动端AppInfoScanner工具信息收集 安卓语法&#xff1a; python app.py android -i <Your apk file> 这个是从app代码中提取信息。 有些app会限制代理抓包&#xff0c;需要进行解壳。 类似CDN的…

【TypeScript】泛型

文章目录 1、介绍2、泛型函数- 定义泛型- 使用泛型 3、泛型接口3.1 约束对象形状&#xff1a;3.2 泛型接口作为函数类型3.3 泛型接口作为字典的类型3.4 泛型接口与多个类型参数 4、泛型类4.1 定义一个泛型类4.2 定义多个类型参数 5、泛型约束5.1 定义约束条件5.2 在泛型约束中使…

Vue中的组件通信方式及应用场景

在Vue中&#xff0c;组件通信有以下几种方式&#xff1a; Props / $emit&#xff1a;父组件通过给子组件传递props属性&#xff0c;子组件通过$emit事件将数据传递给父组件。适用于父组件向子组件传递数据。 自定义事件&#xff1a;父组件通过$on监听子组件触发的事件&#xf…

数据链路层(Data Link Layer)

数据链路层&#xff08;Data Link Layer&#xff09;是计算机网络体系结构中的一层&#xff0c;位于物理层和网络层之间。它的主要功能是在物理传输媒体上建立和管理数据链路。数据链路层的设计和实现对于网络通信的可靠性和效率至关重要。在本文中&#xff0c;我们将探讨数据链…

C#-接口

接口 (interface) 定义了一个可由类和结构实现的协定。接口可以包含方法、属性、事件和索引器。接口不提供它所定义的成员的实现 — 它仅指定实现该接口的类或结构必须提供的成员。 接口可支持多重继承。在下面的示例中&#xff0c;接口 IComboBox 同时从 ITextBox 和 IListBox…

IIS+SDK+VS2010+SP1+SQL server2012全套工具包及安装教程

前言 今天花了两个半小时安装这一整套配置&#xff0c;这个文章的目标是将安装时间缩短到1个小时 正文 安装步骤如下&#xff1a; VS2010 —> service pack 1 —>SQL server2012 —> IIS —> SDK 工具包链接如下&#xff1a; https://pan.baidu.com/s/1WQD-KfiUW…

[技术杂谈]使用VLC将视频转成一个可循环rtsp流

通过vlc播放器&#xff0c;将一个视频转成rtsp流&#xff0c;搭建一个rtsp服务器。rtsp客户端可访问这个视频的rtsp流。 1. 打开vlc播放器&#xff0c;使用的版本如下 2. 菜单&#xff1a;媒体 ---> 流 3. 添加视频文件&#xff0c;点击添加一个mp4 文件 4. 选择串流&…

如何安装和使用夜神模拟器连接Android Studio

目录 简介 一、安装 二、使用 三、更多资源 简介 夜神模拟器是一款在Windows平台上运行的Android模拟器软件。它能够模拟Android操作系统环境&#xff0c;让用户在电脑上轻松体验Android应用程序。夜神模拟器的功能强大&#xff0c;可以满足各种需求&#xff0c;无论是娱乐…