本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes

1 简介

   这是我的系列教程Python+Dash快速web应用开发的第六期,在上一期的文章中,我们完成了对Dash中回调交互高级特性的探讨,在今后陆续推出的教程内容中,我们将一起来学习Dash生态中那些丰富的页面部件,从而赋予我们打造各种强大交互式web应用的能力。

  而在今天的教程内容中,我将带大家学习Dash中实用的一些基础性的静态部件,它们可以帮助我们打造更加正式的web应用。

图1

2 Dash中的基础静态部件

  我们在这里所说的静态页面部件,主要指的是其本身不具备直接的交互功能,而是以呈现内容为主要功能,就像下面的简单对比一样:

app1.py

  1. import dash
  2. import dash_html_components as html
  3. import dash_bootstrap_components as dbc
  4. import dash_core_components as dcc
  5. app = dash.Dash(__name__)
  6. app.layout = html.Div(
  7. dbc.Container(
  8. [
  9. html.Br(),
  10. html.H1('静态部件示例'),
  11. html.Hr(),
  12. html.H2('这是二级标题'),
  13. html.H3('这是三级标题'),
  14. html.H4('这是四级标题'),
  15. html.P(
  16. [
  17. '这是一个',
  18. html.A('链接', href='#'),
  19. ',而这是一段',
  20. html.Strong('加粗文字'),
  21. ',这是一段带上下标的文字:',
  22. '测试',
  23. html.Sup('上标'),
  24. ',测试',
  25. html.Sub('下标')
  26. ]
  27. ),
  28. html.Br(),
  29. html.H1('交互部件示例'),
  30. html.Br(),
  31. dcc.Dropdown(
  32. options=[
  33. {'label': '测试1', 'value': '测试1'},
  34. {'label': '测试2', 'value': '测试2'},
  35. {'label': '测试3', 'value': '测试3'},
  36. ]),
  37. html.Br(),
  38. dcc.Checklist(
  39. options=[
  40. {'label': '测试1', 'value': '测试1'},
  41. {'label': '测试2', 'value': '测试2'},
  42. {'label': '测试3', 'value': '测试3'},
  43. ],
  44. value=['测试1']
  45. ),
  46. html.Br(),
  47. dcc.RangeSlider(
  48. min=0,
  49. max=20,
  50. step=0.5,
  51. value=[5, 15]
  52. )
  53. ]
  54. )
  55. )
  56. if __name__ == '__main__':
  57. app.run_server(debug=True)

图2

  可以看到,静态部件其实就是我们平时浏览网页看到的各种内容元素,他们本身不直接承担回调交互功能,只能配合其他交互部件来实现交互功能。

2.1 Dash中常用的基础静态部件

  在Dash中所集成的一些常用基础性静态部件,其实就是对一些常见html元素的迁移,对应着dash_html_components中封装的众多类,这里我们只介绍部分比较常用的:

2.1.1 与文字格式相关的常用部件

  首先我们来介绍Dash众多基础静态部件中,与组织页面或文字格式相关的一些:

  • H1()到H6()

  在dash_html_components中,H1()H6()分别对应着1级到6级标题。

  • Br()与Hr()

  dash_html_components中的Br()表示换行,而Hr()则表示水平分割线,这在我们布局元素时经常使用到。

  • P()

  P()用于表示一段文字或内容,典型如我们在博客中看到的每一段落内容都是由P()标签所组织的,配合css中的text-indent属性可以用来设置首行缩进。

  • A()

  A()用于表示一个可点击的链接,其参数href用于填入对应跳转的地址,也可以配合id,实现点击重新定位到页面内的其它元素,其target参数用于设置跳转方式,譬如target="_blank"会在新标签页跳转打开,具体内容可参考(https://www.w3school.com.cn/tags/att_a_target.asp)。

  • I()、Code()、U()、Mark()

  I()主要用于在段落中将包裹的文字内容变为斜体Code()用于在一段文字中表示代码片段U()用于给所包含内容添加下划线,Mark()则用于高亮标注文字。

  以上所介绍的这些静态部件可以通过下面的小例子直观的感受一下:

app2.py

  1. import dash
  2. import dash_html_components as html
  3. import dash_bootstrap_components as dbc
  4. app = dash.Dash(__name__)
  5. app.layout = html.Div(
  6. dbc.Container(
  7. [
  8. html.H1('一级标题', id='demo1'),
  9. html.H2('二级标题'),
  10. html.H3('三级标题'),
  11. html.H4('四级标题'),
  12. html.H5('五级标题'),
  13. html.H6('六级标题'),
  14. html.Br(), # 换行
  15. html.Hr(), # 水平分割线
  16. html.P('这是一段文字。'*20),
  17. html.P('这是另一段带有首行缩进的文字。'*10, style={'text-indent': '3rem'}),
  18. html.A('跳转到费弗里的Github仓库',
  19. target='_blank',
  20. href='https://github.com/CNFeffery/DataScienceStudyNotes'), # 跳转到外部链接
  21. html.Br(),
  22. html.A('跳转到六级标题', href='#demo2'),
  23. html.P(
  24. [
  25. '一段文字中出现了',
  26. html.I('斜体'),
  27. ',以及代码片段',
  28. html.Code('import dash'),
  29. ',还有一段',
  30. html.U('带下划线的文字'),
  31. ',一段',
  32. html.Mark('高亮标注文字'),
  33. ',以及另一段',
  34. html.Mark('不同颜色的高亮标注文字。', style={'background-color': 'lightblue'})
  35. ]
  36. )
  37. ] + [html.Br()] * 50 + [html.A('回到顶端一级标题', href='#demo1'),
  38. html.H1('页内元素跳转示例标题', id='demo2')]
  39. )
  40. )
  41. if __name__ == '__main__':
  42. app.run_server(debug=True)

图3

2.1.2 与内容组织相关的常用部件

  前面我们针对常用的一些与文字格式相关的静态部件进行了介绍,而在实际应用中我们不仅要展示文字内容,还需要展示图片、音频、视频等多媒体内容,下面我们来学习如何在Dash中构造更加丰富的内容展示形式:

  • 基于Blockquote()实现块引用

  利用dash_html_components中的Blockquote(),我们可以直接传入字符串,或嵌套其他元素,从而构造出块引用,就像markdown中的>所包含渲染的内容那样,参考下面的例子:

app3.py

  1. import dash
  2. import dash_html_components as html
  3. import dash_bootstrap_components as dbc
  4. app = dash.Dash(__name__)
  5. app.layout = html.Div(
  6. dbc.Container(
  7. html.Blockquote(
  8. html.P('这是一段由块引用包裹的文字内容' * 10),
  9. style={
  10. 'background-color': 'rgba(211, 211, 211, 0.25)',
  11. 'text-indent': '3rem'
  12. }
  13. )
  14. )
  15. )
  16. if __name__ == "__main__":
  17. app.run_server(debug=True)

图4

  • 基于Ol()与Li()渲染有序列表

  利用Ol()嵌套多个Li(),可以自动渲染出带序号的有序列表,就像下面这个简单的例子:

app4.py

  1. import dash
  2. import dash_html_components as html
  3. import dash_bootstrap_components as dbc
  4. app = dash.Dash(__name__)
  5. app.layout = html.Div(
  6. dbc.Container(
  7. html.Ol(
  8. [
  9. html.Br(),
  10. html.Br(),
  11. html.Li('待办事项1'),
  12. html.Li('待办事项2'),
  13. html.Li('待办事项3'),
  14. html.Li('待办事项4')
  15. ]
  16. )
  17. )
  18. )
  19. if __name__ == "__main__":
  20. app.run_server(debug=True)

图5

  • 基于Ul()与Li()渲染层级列表

  而除了与Ol()相互配合之外,Li()还可以嵌套在Ul()中渲染带层级关系的列表:

app5.py

  1. import dash
  2. import dash_html_components as html
  3. import dash_bootstrap_components as dbc
  4. app = dash.Dash(__name__)
  5. app.layout = html.Div(
  6. dbc.Container(
  7. html.Ul(
  8. [
  9. html.Br(),
  10. html.Br(),
  11. html.Li('1'),
  12. html.Li('2'),
  13. html.Ul(
  14. [
  15. html.Li('2.1'),
  16. html.Li('2.2'),
  17. html.Li('2.3'),
  18. html.Ul(
  19. [
  20. html.Li('2.1.1'),
  21. html.Li('2.1.2'),
  22. html.Li('2.1.3'),
  23. ]
  24. )
  25. ]
  26. ),
  27. html.Li('3'),
  28. html.Li('4')
  29. ]
  30. )
  31. )
  32. )
  33. if __name__ == "__main__":
  34. app.run_server(debug=True)

图6

  • 利用Img()渲染图片

  Img()等价于html中的img标签,我们通过src参数传入图片地址来渲染出图片,以我以前一篇博客的作品图片为例:

app6.py

  1. import dash
  2. import dash_html_components as html
  3. import dash_bootstrap_components as dbc
  4. app = dash.Dash(__name__)
  5. app.layout = html.Div(
  6. dbc.Container(
  7. [
  8. html.H5('(在模仿中精进数据可视化05)疫情期间市值增长top25公司'),
  9. html.Img(src='https://img2020.cnblogs.com/blog/1344061/202011/1344061-20201129183046286-1089258422.png',
  10. style={'width': '100%'})
  11. ]
  12. )
  13. )
  14. if __name__ == "__main__":
  15. app.run_server(debug=True)

图7

  • 利用Audio()与Video()播放音频与视频

  利用Audio()Video(),我们可以通过参数src传入对应音频与视频文件的url地址,从而实现在网页中嵌入音频与视频,其中参数controls必须设置为True否则不会正常渲染:

app7.py

  1. import dash
  2. import dash_html_components as html
  3. import dash_bootstrap_components as dbc
  4. app = dash.Dash(__name__)
  5. app.layout = html.Div(
  6. dbc.Container(
  7. [
  8. html.H5('音频示例:'),
  9. html.Audio(src='https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3',
  10. controls=True),
  11. html.H5('视频示例:'),
  12. html.Video(src='https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4',
  13. controls=True,
  14. style={'width': '100%'}),
  15. ]
  16. )
  17. )
  18. if __name__ == "__main__":
  19. app.run_server(debug=True)

图8

  • 利用Iframe()嵌入其他网页

  类似iframe标签,我们也可以利用Iframe()来在网页中嵌入其他网页,可以通过src参数直接传入目标网页url,也可以通过srcDoc参数传入整个网页的html源码字符串:

app8.py

  1. import dash
  2. import dash_html_components as html
  3. import dash_bootstrap_components as dbc
  4. app = dash.Dash(__name__)
  5. app.layout = html.Div(
  6. dbc.Container(
  7. [
  8. html.Iframe(src='https://www.baidu.com/',
  9. style={'width': '100%', 'height': '800px'})
  10. ]
  11. )
  12. )
  13. if __name__ == "__main__":
  14. app.run_server(debug=True)

图9

  • 利用Textarea()构造输入框

  有时候我们需要构造出一个能供用户输入大段文字的输入框,譬如很多的在线编辑器,而在Dash中我们可以使用dash_core_components中的Textarea()来实现这个功能,并且dcc.Textarea()同样具有valueplaceholder属性,可以配合回调函数实现很多功能。

  譬如下面的例子中我们编写了一个简单的脏话和谐工具,会将用户输入的所有他妈替换为“**”:

app9.py

  1. import dash
  2. import dash_html_components as html
  3. import dash_bootstrap_components as dbc
  4. import dash_core_components as dcc
  5. from dash.dependencies import Input, Output
  6. app = dash.Dash(__name__)
  7. app.layout = html.Div(
  8. dbc.Container(
  9. [
  10. html.Br(),
  11. dcc.Textarea(style={'width': '100%', 'height': '300px'},
  12. id='input',
  13. value='',
  14. placeholder='请输入文字内容!'),
  15. html.P(id='output')
  16. ]
  17. )
  18. )
  19. @app.callback(
  20. Output('output', 'children'),
  21. Input('input', 'value')
  22. )
  23. def mask_dirty_talk(value):
  24. return value.replace('他妈', '**')
  25. if __name__ == "__main__":
  26. app.run_server(debug=True)

图10

2.2 dcc.Markdown()——Dash中特殊的静态部件

  在Dash中还存在一个比较特别的用于呈现静态内容的部件——dcc.Markdown(),它的children参数接受markdown代码,并自动在网页中呈现出渲染后的效果,其主要参数如下:

children:字符型markdown源码

dangerously_allow_html:bool型,用于设置是否允许解析出markdown源码中的html代码并渲染,默认为False即不进行渲染

dedent:bool型,用于设置是否忽略每行文字开头的代码,默认为True

  效果如下:

app10.py

  1. import dash
  2. import dash_core_components as dcc
  3. import dash_html_components as html
  4. import dash_bootstrap_components as dbc
  5. app = dash.Dash(__name__)
  6. app.layout = html.Div(
  7. dbc.Container(
  8. [
  9. dcc.Markdown('''
  10. > 本文示例代码已上传至我的`Github`仓库[https://github.com/CNFeffery/DataScienceStudyNotes](https://github.com/CNFeffery/DataScienceStudyNotes)
  11. # 1 简介
  12.    这是我的系列教程**Python+Dash快速web应用开发**的第五期,在上一期的文章中,我们针对`Dash`中有关回调的一些技巧性的特性进行了介绍,使得我们可以更愉快地为`Dash`应用编写回调交互功能。
  13.   而今天的文章作为**回调交互**系统性内容的最后一期,我将带大家get一些`Dash`中实际应用效果惊人的**高级回调特性**,系好安全带,我们起飞~
  14. <p align="center"><img src="https://img2020.cnblogs.com/blog/1344061/202102/1344061-20210207194037614-808613819.png" style="zoom:100%;" /></p>
  15. ''',
  16. dangerously_allow_html=True,
  17. dedent=False)
  18. ]
  19. )
  20. )
  21. if __name__ == "__main__":
  22. app.run_server(debug=True)

图11

  有了Markdown()部件的加持,我们就可以在某些情况下直接利用markdown快速编写网页,譬如编写在线文档说明页面~

3 利用Dash自制在线Markdown编辑器

  在掌握了今天的教程所涉及知识之后,我们就可以自己动手书写一些具有实际交互功能的界面,譬如自制一个在线Markdown编辑器。

  思路很简单,利用今天所学的Textarea()部件的value属性作为回调的Input(),再将Markdown()部件的children元素作为回调的Output(),再略微美化一下布局,便实现了如下的效果~

图12

  对应的代码如下:

app11.py

  1. import dash
  2. import dash_html_components as html
  3. import dash_core_components as dcc
  4. import dash_bootstrap_components as dbc
  5. from dash.dependencies import Input, Output
  6. app = dash.Dash(__name__)
  7. app.layout = html.Div(
  8. dbc.Container(
  9. dbc.Row(
  10. [
  11. dbc.Col(
  12. dcc.Textarea(
  13. id='md-input',
  14. placeholder='请输入你的markdown源码!',
  15. style={
  16. 'width': '100%',
  17. 'height': '100%'
  18. }
  19. ),
  20. width=6,
  21. style={
  22. 'padding-right': 0,
  23. 'border': 'border:5px solid red'
  24. }
  25. ),
  26. dbc.Col(
  27. dcc.Markdown(id='md-output',
  28. dangerously_allow_html=True,
  29. style={
  30. 'position': 'absolute',
  31. 'width': '100%',
  32. 'height': '100%'
  33. }),
  34. width=6,
  35. style={
  36. 'position': 'relative',
  37. 'overflow': 'auto',
  38. 'padding-left': 0
  39. }
  40. ),
  41. ],
  42. style={
  43. 'position': 'fixed',
  44. 'top': 0,
  45. 'bottom': 0,
  46. 'left': 0,
  47. 'right': 0
  48. }
  49. )
  50. ),
  51. style={
  52. 'font-size': '2rem'
  53. }
  54. )
  55. @app.callback(
  56. Output('md-output', 'children'),
  57. Input('md-input', 'value')
  58. )
  59. def online_markdown(raw_text):
  60. return raw_text
  61. if __name__ == '__main__':
  62. app.run_server(debug=True)

  以上就是本文的全部内容,我们将在下一篇教程中继续探讨Dash中那些更加好用且功能更加丰富的静态部件,敬请期待~

  以上就是本文的全部内容,欢迎在评论区与我进行讨论。

(数据科学学习手札108)Python+Dash快速web应用开发——静态部件篇(上)的更多相关文章

  1. (数据科学学习手札109)Python+Dash快速web应用开发——静态部件篇(中)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  2. (数据科学学习手札110)Python+Dash快速web应用开发——静态部件篇(下)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  3. (数据科学学习手札118)Python+Dash快速web应用开发——特殊部件篇

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  4. (数据科学学习手札102)Python+Dash快速web应用开发——基础概念篇

    本文示例代码与数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的新系列教程Python+Dash快 ...

  5. (数据科学学习手札115)Python+Dash快速web应用开发——交互表格篇(上)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  6. (数据科学学习手札116)Python+Dash快速web应用开发——交互表格篇(中)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  7. (数据科学学习手札117)Python+Dash快速web应用开发——交互表格篇(下)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  8. (数据科学学习手札103)Python+Dash快速web应用开发——页面布局篇

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  9. (数据科学学习手札105)Python+Dash快速web应用开发——回调交互篇(中)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

随机推荐

  1. Django(自定义过滤器和自定义标签)

    模版是一个用django模版语言标记过的python字符串.模版可以包含模版标签和变量. 模版标签是在一个模版里起作用的标记.比如,一个模版标签可以产生控制结构的内容(if或者for),可以获取数据库 ...

  2. ceph --- (简单操作及openstack交接)

    部署ceph :https://www.cnblogs.com/cloudhere/p/10519647.html Centos7部署ceph:https://www.cnblogs.com/kevi ...

  3. Flink-v1.12官方网站翻译-P022-Working with State

    有状态程序 在本节中,您将了解Flink为编写有状态程序提供的API.请看一下Stateful Stream Processing来了解有状态流处理背后的概念. 带键值的数据流 如果要使用键控状态,首 ...

  4. 记angular和asp.net使用grpc进行通信

    AspNetCore配置grpc服务端 新建一个Demo项目: GrpcStartup, 目录结构如下图: GrpcStartup.GrpcServices需要安装下面的依赖 <PackageR ...

  5. 解析一下C++的异常处理

    ​ 作者:良知犹存 转载授权以及围观:欢迎添加微信:Allen-Iverson-me-LYN 总述     在程序运行过程中经常会碰到一些问题,例如数组下标越界,除数为零等,这些错误不过能被发现处理, ...

  6. A - 规律题

    我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示. Input输 ...

  7. 1151 LCA in a Binary Tree

    The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U ...

  8. gym101002K. Inversions (FFT)

    题意:给定一个仅含有AB的字母串 如果i有一个B j有一个A 且j>i 会对F(j-i)产生贡献 求出所有发Fi 题解:好像是很裸的FFT B的分布可以看作一个多项式 同理A也可以 然后把B的位 ...

  9. 整体算力提升40% 芯片级安全防护 | 阿里云发布第七代ECS云服务器

    2 月 8 日,阿里云宣布推出第七代 ECS 云服务器产品家族,基于最新的神龙架构,相较于上一代整体算力提升 40%,容器部署密度最大可提升 6 倍,是最佳的云原生载体,此外全量搭载安全芯片,实现&q ...

  10. JS编程练习:封装insertAfter函数(功能类似于系统insertBefor)

    那么insertAfter()要实现的功能: 在指定的子节点后面插入新的子节点: 1 <body> 2 <div> 3 <p></p> 4 <sp ...