1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        60行Python代碼開發(fā)在線markdown編輯器

        共 12331字,需瀏覽 25分鐘

         ·

        2021-02-21 06:21

        a37e619d64a61eb44c8ea30adebd972c.webp

        添加微信號"CNFeffery"加入技術(shù)交流群

        ?

        本文示例代碼已上傳至我的Github倉庫https://github.com/CNFeffery/DataScienceStudyNotes

        ?
        1 簡介

        這是我的系列教程「Python+Dash快速web應(yīng)用開發(fā)」的第六期,在上一期的文章中,我們完成了對Dash中回調(diào)交互高級特性的探討,在今后陸續(xù)推出的教程內(nèi)容中,我們將一起來學習Dash生態(tài)中那些豐富的「頁面部件」,從而賦予我們打造各種強大交互式web應(yīng)用的能力。

        而在今天的教程內(nèi)容中,我將帶大家學習Dash中實用的一些基礎(chǔ)性的「靜態(tài)部件」,它們可以幫助我們打造更加正式的web應(yīng)用,并在最后教大家如何僅僅60行代碼就開發(fā)出一個在線markdown編輯器。

        affe07a4e4788ddcab637735f268dea6.webp圖12 Dash中的基礎(chǔ)靜態(tài)部件

        我們在這里所說的靜態(tài)頁面部件,主要指的是其本身不具備直接的交互功能,而是以「呈現(xiàn)內(nèi)容」為主要功能,就像下面的簡單對比一樣:

        ?

        app1.py

        ?
        import?dash
        import?dash_html_components?as?html
        import?dash_bootstrap_components?as?dbc
        import?dash_core_components?as?dcc

        app?=?dash.Dash(__name__)

        app.layout?=?html.Div(
        ????dbc.Container(
        ????????[
        ????????????html.Br(),
        ????????????html.H1('靜態(tài)部件示例'),
        ????????????html.Hr(),
        ????????????html.H2('這是二級標題'),
        ????????????html.H3('這是三級標題'),
        ????????????html.H4('這是四級標題'),
        ????????????html.P(
        ????????????????[
        ????????????????????'這是一個',
        ????????????????????html.A('鏈接',?href='#'),
        ????????????????????',而這是一段',
        ????????????????????html.Strong('加粗文字'),
        ????????????????????',這是一段帶上下標的文字:',
        ????????????????????'測試',
        ????????????????????html.Sup('上標'),
        ????????????????????',測試',
        ????????????????????html.Sub('下標')
        ????????????????]
        ????????????),

        ????????????html.Br(),
        ????????????html.H1('交互部件示例'),
        ????????????html.Br(),
        ????????????dcc.Dropdown(
        ????????????????options=[
        ????????????????????{'label':?'測試1',?'value':?'測試1'},
        ????????????????????{'label':?'測試2',?'value':?'測試2'},
        ????????????????????{'label':?'測試3',?'value':?'測試3'},
        ????????????????]),
        ????????????html.Br(),
        ????????????dcc.Checklist(
        ????????????????options=[
        ????????????????????{'label':?'測試1',?'value':?'測試1'},
        ????????????????????{'label':?'測試2',?'value':?'測試2'},
        ????????????????????{'label':?'測試3',?'value':?'測試3'},
        ????????????????],
        ????????????????value=['測試1']
        ????????????),
        ????????????html.Br(),
        ????????????dcc.RangeSlider(
        ????????????????min=0,
        ????????????????max=20,
        ????????????????step=0.5,
        ????????????????value=[5,?15]
        ????????????)
        ????????]
        ????)
        )

        if?__name__?==?'__main__':
        ????app.run_server(debug=True)
        ca94df6ebfb2c973f280fd034adc5232.webp圖2

        可以看到,靜態(tài)部件其實就是我們平時瀏覽網(wǎng)頁看到的各種內(nèi)容元素,他們本身不直接承擔回調(diào)交互功能,只能配合其他交互部件來實現(xiàn)交互功能。

        2.1 Dash中常用的基礎(chǔ)靜態(tài)部件

        Dash中所集成的一些常用基礎(chǔ)性靜態(tài)部件,其實就是對一些常見html元素的遷移,對應(yīng)著dash_html_components中封裝的眾多類,這里我們只介紹部分比較常用的:

        2.1.1 與文字格式相關(guān)的常用部件

        首先我們來介紹Dash眾多基礎(chǔ)靜態(tài)部件中,與組織頁面或文字格式相關(guān)的一些:

        • 「H1()到H6()」

        dash_html_components中,H1()H6()分別對應(yīng)著1級到6級標題。

        • 「Br()與Hr()」

        dash_html_components中的Br()表示換行,而Hr()則表示水平分割線,這在我們布局元素時經(jīng)常使用到。

        • 「P()」

        P()用于表示一段文字或內(nèi)容,典型如我們在博客中看到的每一段落內(nèi)容都是由P()標簽所組織的,配合css中的text-indent屬性可以用來設(shè)置首行縮進。

        • 「A()」

        A()用于表示一個可點擊的鏈接,其參數(shù)href用于填入對應(yīng)跳轉(zhuǎn)的地址,也可以配合id,實現(xiàn)點擊重新定位到頁面內(nèi)的其它元素,其target參數(shù)用于設(shè)置跳轉(zhuǎn)方式,譬如target="_blank"會在新標簽頁跳轉(zhuǎn)打開,具體內(nèi)容可參考(https://www.w3school.com.cn/tags/att_a_target.asp)。

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

        I()主要用于在段落中將包裹的文字內(nèi)容變?yōu)?span>斜體,Code()用于在一段文字中表示代碼片段,U()用于給所包含內(nèi)容添加下劃線,Mark()則用于高亮標注文字。

        以上所介紹的這些靜態(tài)部件可以通過下面的小例子直觀的感受一下:

        ?

        app2.py

        ?
        import?dash
        import?dash_html_components?as?html
        import?dash_bootstrap_components?as?dbc

        app?=?dash.Dash(__name__)

        app.layout?=?html.Div(
        ????dbc.Container(
        ????????[
        ????????????html.H1('一級標題',?id='demo1'),
        ????????????html.H2('二級標題'),
        ????????????html.H3('三級標題'),
        ????????????html.H4('四級標題'),
        ????????????html.H5('五級標題'),
        ????????????html.H6('六級標題'),
        ????????????html.Br(),?#?換行
        ????????????html.Hr(),?#?水平分割線
        ????????????html.P('這是一段文字。'*20),
        ????????????html.P('這是另一段帶有首行縮進的文字。'*10,?style={'text-indent':?'3rem'}),
        ????????????html.A('跳轉(zhuǎn)到費弗里的Github倉庫',
        ???????????????????target='_blank',
        ???????????????????href='https://github.com/CNFeffery/DataScienceStudyNotes'),?#?跳轉(zhuǎn)到外部鏈接
        ????????????html.Br(),
        ????????????html.A('跳轉(zhuǎn)到六級標題',?href='#demo2'),
        ????????????html.P(
        ????????????????[
        ????????????????????'一段文字中出現(xiàn)了',
        ????????????????????html.I('斜體'),
        ????????????????????',以及代碼片段',
        ????????????????????html.Code('import?dash'),
        ????????????????????',還有一段',
        ????????????????????html.U('帶下劃線的文字'),
        ????????????????????',一段',
        ????????????????????html.Mark('高亮標注文字'),
        ????????????????????',以及另一段',
        ????????????????????html.Mark('不同顏色的高亮標注文字。',?style={'background-color':?'lightblue'})
        ?????????????????]
        ????????????)
        ????????]?+?[html.Br()]?*?50?+?[html.A('回到頂端一級標題',?href='#demo1'),
        ????????????????????????????????html.H1('頁內(nèi)元素跳轉(zhuǎn)示例標題',?id='demo2')]
        ????)
        )


        if?__name__?==?'__main__':
        ????app.run_server(debug=True)
        eb87728915bf84c4a30140d0ee3feb32.webp圖3

        2.1.2 與內(nèi)容組織相關(guān)的常用部件

        前面我們針對常用的一些與文字格式相關(guān)的靜態(tài)部件進行了介紹,而在實際應(yīng)用中我們不僅要展示文字內(nèi)容,還需要展示圖片、音頻、視頻等多媒體內(nèi)容,下面我們來學習如何在Dash中構(gòu)造更加豐富的內(nèi)容展示形式:

        • 「基于Blockquote()實現(xiàn)塊引用」

        利用dash_html_components中的Blockquote(),我們可以直接傳入字符串,或嵌套其他元素,從而構(gòu)造出塊引用,就像markdown中的>所包含渲染的內(nèi)容那樣,參考下面的例子:

        ?

        app3.py

        ?
        import?dash
        import?dash_html_components?as?html
        import?dash_bootstrap_components?as?dbc

        app?=?dash.Dash(__name__)

        app.layout?=?html.Div(
        ????dbc.Container(
        ????????html.Blockquote(
        ????????????html.P('這是一段由塊引用包裹的文字內(nèi)容'?*?10),
        ????????????style={
        ????????????????'background-color':?'rgba(211,?211,?211,?0.25)',
        ????????????????'text-indent':?'3rem'
        ????????????}
        ????????)
        ????)
        )

        if?__name__?==?"__main__":
        ????app.run_server(debug=True)
        0051dfa6901001dab8ead36705a76838.webp圖4
        • 「基于Ol()與Li()渲染有序列表」

        利用Ol()嵌套多個Li(),可以自動渲染出帶序號的有序列表,就像下面這個簡單的例子:

        ?

        app4.py

        ?
        import?dash
        import?dash_html_components?as?html
        import?dash_bootstrap_components?as?dbc

        app?=?dash.Dash(__name__)

        app.layout?=?html.Div(
        ????dbc.Container(
        ????????html.Ol(
        ????????????[
        ????????????????html.Br(),
        ????????????????html.Br(),
        ????????????????html.Li('待辦事項1'),
        ????????????????html.Li('待辦事項2'),
        ????????????????html.Li('待辦事項3'),
        ????????????????html.Li('待辦事項4')
        ????????????]
        ????????)
        ????)
        )

        if?__name__?==?"__main__":
        ????app.run_server(debug=True)
        6f594d60bdf26b1a25041a923ba89fda.webp圖5
        • 「基于Ul()與Li()渲染層級列表」

        而除了與Ol()相互配合之外,Li()還可以嵌套在Ul()中渲染帶層級關(guān)系的列表:

        ?

        app5.py

        ?
        import?dash
        import?dash_html_components?as?html
        import?dash_bootstrap_components?as?dbc

        app?=?dash.Dash(__name__)

        app.layout?=?html.Div(
        ????dbc.Container(
        ????????html.Ul(
        ????????????[
        ????????????????html.Br(),
        ????????????????html.Br(),
        ????????????????html.Li('1'),
        ????????????????html.Li('2'),
        ????????????????html.Ul(
        ????????????????????[
        ????????????????????????html.Li('2.1'),
        ????????????????????????html.Li('2.2'),
        ????????????????????????html.Li('2.3'),
        ????????????????????????html.Ul(
        ????????????????????????????[
        ????????????????????????????????html.Li('2.1.1'),
        ????????????????????????????????html.Li('2.1.2'),
        ????????????????????????????????html.Li('2.1.3'),
        ????????????????????????????]
        ????????????????????????)
        ????????????????????]
        ????????????????),
        ????????????????html.Li('3'),
        ????????????????html.Li('4')
        ????????????]
        ????????)
        ????)
        )

        if?__name__?==?"__main__":
        ????app.run_server(debug=True)
        e86dfa76edf752a452224dc2e9077a18.webp圖6
        • 「利用Img()渲染圖片」

        Img()等價于html中的img標簽,我們通過src參數(shù)傳入圖片地址來渲染出圖片,以我以前一篇博客的作品圖片為例:

        ?

        app6.py

        ?
        import?dash
        import?dash_html_components?as?html
        import?dash_bootstrap_components?as?dbc

        app?=?dash.Dash(__name__)

        app.layout?=?html.Div(
        ????dbc.Container(
        ????????[
        ????????????html.H5('(在模仿中精進數(shù)據(jù)可視化05)疫情期間市值增長top25公司'),
        ????????????html.Img(src='https://img2020.cnblogs.com/blog/1344061/202011/1344061-20201129183046286-1089258422.png',
        ?????????????????????style={'width':?'100%'})
        ????????]
        ????)
        )

        if?__name__?==?"__main__":
        ????app.run_server(debug=True)
        ecc1e08ed0c99b89ffe6f46826d6648f.webp圖7
        • 「利用Audio()與Video()播放音頻與視頻」

        利用Audio()Video(),我們可以通過參數(shù)src傳入對應(yīng)音頻與視頻文件的url地址,從而實現(xiàn)在網(wǎng)頁中嵌入音頻與視頻,其中參數(shù)controls必須設(shè)置為True否則不會正常渲染:

        ?

        app7.py

        ?
        import?dash
        import?dash_html_components?as?html
        import?dash_bootstrap_components?as?dbc

        app?=?dash.Dash(__name__)

        app.layout?=?html.Div(
        ????dbc.Container(
        ????????[
        ????????????html.H5('音頻示例:'),
        ????????????html.Audio(src='https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3',
        ???????????????????????controls=True),
        ????????????html.H5('視頻示例:'),
        ????????????html.Video(src='https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4',
        ???????????????????????controls=True,
        ???????????????????????style={'width':?'100%'}),
        ????????]
        ????)
        )

        if?__name__?==?"__main__":
        ????app.run_server(debug=True)

        ba04e877aaae6dbdee5b543f13608829.webp

        圖8
        • 「利用Iframe()嵌入其他網(wǎng)頁」

        類似iframe標簽,我們也可以利用Iframe()來在網(wǎng)頁中嵌入其他網(wǎng)頁,可以通過src參數(shù)直接傳入目標網(wǎng)頁url,也可以通過srcDoc參數(shù)傳入整個網(wǎng)頁的html源碼字符串:

        ?

        app8.py

        ?
        import?dash
        import?dash_html_components?as?html
        import?dash_bootstrap_components?as?dbc

        app?=?dash.Dash(__name__)

        app.layout?=?html.Div(
        ????dbc.Container(
        ????????[
        ????????????html.Iframe(src='https://www.baidu.com/',
        ????????????????????????style={'width':?'100%',?'height':?'800px'})
        ????????]
        ????)
        )

        if?__name__?==?"__main__":
        ????app.run_server(debug=True)
        23af611fb804b2965a8d58f1e6035473.webp圖9
        • 「利用Textarea()構(gòu)造輸入框」

        有時候我們需要構(gòu)造出一個能供用戶輸入大段文字的輸入框,譬如很多的在線編輯器,而在Dash中我們可以使用dash_core_components中的Textarea()來實現(xiàn)這個功能,并且dcc.Textarea()同樣具有valueplaceholder屬性,可以配合回調(diào)函數(shù)實現(xiàn)很多功能。

        譬如下面的例子中我們編寫了一個簡單的臟話和諧工具,會將用戶輸入的所有他媽替換為“**”??:

        ?

        app9.py

        ?
        import?dash
        import?dash_html_components?as?html
        import?dash_bootstrap_components?as?dbc
        import?dash_core_components?as?dcc
        from?dash.dependencies?import?Input,?Output

        app?=?dash.Dash(__name__)

        app.layout?=?html.Div(
        ????dbc.Container(
        ????????[
        ????????????html.Br(),
        ????????????dcc.Textarea(style={'width':?'100%',?'height':?'300px'},
        ?????????????????????????id='input',
        ?????????????????????????value='',
        ?????????????????????????placeholder='請輸入文字內(nèi)容!'),
        ????????????html.P(id='output')
        ????????]
        ????)
        )

        @app.callback(
        ????Output('output',?'children'),
        ????Input('input',?'value')
        )
        def?mask_dirty_talk(value):

        ????return?value.replace('他媽',?'**')


        if?__name__?==?"__main__":
        ????app.run_server(debug=True)
        d82e2fc64e72b7814041e9df35497c5d.webp圖10

        2.2 dcc.Markdown()——Dash中特殊的靜態(tài)部件

        Dash中還存在一個比較特別的用于呈現(xiàn)靜態(tài)內(nèi)容的部件——dcc.Markdown(),它的children參數(shù)接受markdown代碼,并自動在網(wǎng)頁中呈現(xiàn)出渲染后的效果,其主要參數(shù)如下:

        ?

        「children」:字符型markdown源碼

        「dangerously_allow_html」:bool型,用于設(shè)置是否允許解析出markdown源碼中的html代碼并渲染,默認為False即不進行渲染

        「dedent」:bool型,用于設(shè)置是否忽略每行文字開頭的代碼,默認為True

        ?

        效果如下:

        ?

        app10.py

        ?
        import?dash
        import?dash_core_components?as?dcc
        import?dash_html_components?as?html
        import?dash_bootstrap_components?as?dbc

        app?=?dash.Dash(__name__)

        app.layout?=?html.Div(
        ????dbc.Container(
        ????????[
        ????????????dcc.Markdown('''
        >?本文示例代碼已上傳至我的`Github`倉庫[https://github.com/CNFeffery/DataScienceStudyNotes](https://github.com/CNFeffery/DataScienceStudyNotes)

        #?1?簡介

        ???這是我的系列教程**Python+Dash快速web應(yīng)用開發(fā)**的第五期,在上一期的文章中,我們針對`Dash`中有關(guān)回調(diào)的一些技巧性的特性進行了介紹,使得我們可以更愉快地為`Dash`應(yīng)用編寫回調(diào)交互功能。

        ??而今天的文章作為**回調(diào)交互**系統(tǒng)性內(nèi)容的最后一期,我將帶大家get一些`Dash`中實際應(yīng)用效果驚人的**高級回調(diào)特性**,系好安全帶,我們起飛~

        <p?align="center"><img?src="https://img2020.cnblogs.com/blog/1344061/202102/1344061-20210207194037614-808613819.png"?style="zoom:100%;"?/></p>

        '''
        ,
        ?????????????????????????dangerously_allow_html=True,
        ?????????????????????????dedent=False)
        ????????]
        ????)
        )

        if?__name__?==?"__main__":
        ????app.run_server(debug=True)
        34dfc25d7444c697c87bb0a013ee6f17.webp圖11

        有了Markdown()部件的加持,我們就可以在某些情況下直接利用markdown快速編寫網(wǎng)頁,譬如編寫在線文檔說明頁面~

        3 利用Dash自制在線Markdown編輯器

        在掌握了今天的教程所涉及知識之后,我們就可以自己動手書寫一些具有實際交互功能的界面,譬如自制一個在線Markdown編輯器。

        思路很簡單,利用今天所學的Textarea()部件的value屬性作為回調(diào)的Input(),再將Markdown()部件的children元素作為回調(diào)的Output(),再略微美化一下布局,便實現(xiàn)了如下的效果~

        e82a3b72e00cf532b8d71cd693954646.webp圖12

        對應(yīng)的代碼如下:

        ?

        app11.py

        ?
        import?dash
        import?dash_html_components?as?html
        import?dash_core_components?as?dcc
        import?dash_bootstrap_components?as?dbc
        from?dash.dependencies?import?Input,?Output

        app?=?dash.Dash(__name__)

        app.layout?=?html.Div(
        ????dbc.Container(
        ????????dbc.Row(
        ????????????[
        ????????????????dbc.Col(
        ????????????????????dcc.Textarea(
        ????????????????????????id='md-input',
        ????????????????????????placeholder='請輸入你的markdown源碼!',
        ????????????????????????style={
        ????????????????????????????'width':?'100%',
        ????????????????????????????'height':?'100%'
        ????????????????????????}
        ????????????????????),
        ????????????????????width=6,
        ????????????????????style={
        ????????????????????????'padding-right':?0,
        ????????????????????????'border':?'border:5px?solid?red'
        ????????????????????}
        ????????????????),
        ????????????????dbc.Col(
        ????????????????????dcc.Markdown(id='md-output',
        ?????????????????????????????????dangerously_allow_html=True,
        ?????????????????????????????????style={
        ?????????????????????????????????????'position':?'absolute',
        ?????????????????????????????????????'width':?'100%',
        ?????????????????????????????????????'height':?'100%'
        ?????????????????????????????????}),
        ????????????????????width=6,
        ????????????????????style={
        ????????????????????????'position':?'relative',
        ????????????????????????'overflow':?'auto',
        ????????????????????????'padding-left':?0
        ????????????????????}
        ????????????????),
        ????????????],
        ????????????style={
        ????????????????'position':?'fixed',
        ????????????????'top':?0,
        ????????????????'bottom':?0,
        ????????????????'left':?0,
        ????????????????'right':?0
        ????????????}
        ????????)
        ????),
        ????style={
        ????????'font-size':?'2rem'
        ????}
        )

        @app.callback(
        ????Output('md-output',?'children'),
        ????Input('md-input',?'value')
        )
        def?online_markdown(raw_text):
        ????return?raw_text

        if?__name__?==?'__main__':
        ????app.run_server(debug=True)

        以上就是本文的全部內(nèi)容,我們將在下一篇教程中繼續(xù)探討Dash中那些更加好用且功能更加豐富的靜態(tài)部件,敬請期待~?也歡迎大家在評論區(qū)與我進行討論~

        32a9f38e6765acd5b7e74717fe7c8aea.webp

        加入知識星球【我們談?wù)摂?shù)據(jù)科學】

        300+小伙伴一起學習!







        · 推薦閱讀?·

        pythonic風格代碼有什么好處?附12個代碼實例

        Python+Dash快速web應(yīng)用開發(fā):回調(diào)交互篇(下)

        在Python中一馬平川的書寫代碼!


        瀏覽 57
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            操逼com | 国产精品视频大全 | 波多野结衣成人视频 | 日日噜噜夜夜狠狠爱视频免费樱桃 | 四川老太婆50岁毛片 | 一区欧美 | 黄色精品视频在线观看 | 91久久精品國產亞洲 | 大焦煮伊人 | 欧美日韩卡一卡二在线播放视频 |