• tkinter文本框小功能(6):锚点


    引言

    锚点之一概念在文本浏览中很常见,那就是在同一页面的文本内容在,添加一个锚点标识符,指向一个确定的标识(mark),而且这个标识在文本渲染后真是存在。当读者点击标识时,会自动显示到相关的内容部分。因此,这个功能虽小,但是确实很实用。特别是单页文本比较长时,使用目录和锚点搭配,可以达到很好的效果。

    因此,与其说锚点是文本框的一种功能,它更像是一种阅读体验。


    添加标识

    在tkinter.Text中,我们可以使用mark_set方法来添加标记。

    好处在于这是一个现成的标记方法,而且可以指定位置。

    self.mark_set(mark_name,index)
    
    • 1

    而在Tin标记语言中,使用标签进行类似操作。不过更加方便的是,标签不需要指定标记位置,因为TinEngine会自动锁定当前渲染输出位置。也就是说,当你需要在某一个部分的内容添加标记时,不需要理会上下文是什么,也不需要知道渲染到这里到底是什么index位置,只需要在这里添加一个标记即可。

    这样的设计可以让编写者更清楚自己在写什么而不是要一直使用mark_set来进行反复测试。

    标记测试
    <main>随便什么内容
    <sp>5
    
    <main>下面一行的开头有一个标记
    <mark>tag1
    <sp>3
    
    <middle>本文末尾有一个tag2
    <mark>tag2
    <sp>
    
    ;下面省略
    <div class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li><li style="color: rgb(153, 153, 153);">2</li><li style="color: rgb(153, 153, 153);">3</li><li style="color: rgb(153, 153, 153);">4</li><li style="color: rgb(153, 153, 153);">5</li><li style="color: rgb(153, 153, 153);">6</li><li style="color: rgb(153, 153, 153);">7</li><li style="color: rgb(153, 153, 153);">8</li><li style="color: rgb(153, 153, 153);">9</li><li style="color: rgb(153, 153, 153);">10</li><li style="color: rgb(153, 153, 153);">11</li><li style="color: rgb(153, 153, 153);">12</li><li style="color: rgb(153, 153, 153);">13</li></ul></pre> 
    <hr> 
    <h2><a name="t3"></a><a id="_42"></a>添加锚点</h2> 
    <h3><a name="t4"></a><a id="python_44"></a>python层面</h3> 
    <p>这个在tkinter中就没有现成的功能了。</p> 
    <p>在TinEngine中,使用了如下类似代码来处理标签:</p> 
    <pre data-index="2" class="set-code-show prettyprint"><code class="prism language-python has-numbering" onclick="mdcp.signin(event)" style="position: unset;">                <span class="token keyword">if</span> tag_num<span class="token operator">></span><span class="token number">3</span><span class="token punctuation">:</span>
                        self<span class="token punctuation">.</span>error<span class="token punctuation">(</span><span class="token builtin">str</span><span class="token punctuation">(</span>tag_count<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token string">'<acr>最多支持三个参数:<acr>mark;fg;bg'</span><span class="token punctuation">)</span>
                        out<span class="token punctuation">(</span><span class="token punctuation">)</span>
                    <span class="token keyword">if</span> u<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token operator">==</span><span class="token string">''</span><span class="token punctuation">:</span>
                        out<span class="token punctuation">(</span><span class="token punctuation">)</span>
                    <span class="token keyword">if</span> tag_num<span class="token operator">==</span><span class="token number">1</span><span class="token punctuation">:</span>
                        state<span class="token operator">=</span>self<span class="token punctuation">.</span>arc_<span class="token punctuation">(</span>u<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
                    <span class="token keyword">else</span><span class="token punctuation">:</span>
                        state<span class="token operator">=</span>self<span class="token punctuation">.</span>arc_<span class="token punctuation">(</span><span class="token operator">*</span>u<span class="token punctuation">)</span>
                    <span class="token keyword">if</span> <span class="token keyword">not</span> state<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token comment">#不正常</span>
                        out<span class="token punctuation">(</span><span class="token punctuation">)</span>
    <div class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li><li style="color: rgb(153, 153, 153);">2</li><li style="color: rgb(153, 153, 153);">3</li><li style="color: rgb(153, 153, 153);">4</li><li style="color: rgb(153, 153, 153);">5</li><li style="color: rgb(153, 153, 153);">6</li><li style="color: rgb(153, 153, 153);">7</li><li style="color: rgb(153, 153, 153);">8</li><li style="color: rgb(153, 153, 153);">9</li><li style="color: rgb(153, 153, 153);">10</li><li style="color: rgb(153, 153, 153);">11</li></ul></pre> 
    <p>大家不需要理会这些代码的具体含义,因为这个不是重点。</p> 
    <p>在python层面,主要是写响应功能。剩下的两个颜色参数都是由编写者自行决定的。接下来才是主要功能代码。</p> 
    <pre data-index="3" class="set-code-show prettyprint"><code class="prism language-python has-numbering" onclick="mdcp.signin(event)" style="position: unset;">    <span class="token keyword">def</span> <span class="token function">arc_</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span>mark<span class="token punctuation">,</span>f<span class="token operator">=</span><span class="token string">''</span><span class="token punctuation">,</span>b<span class="token operator">=</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
            acr_tag<span class="token operator">=</span><span class="token string">'acr_'</span><span class="token operator">+</span>f<span class="token operator">+</span>b
            <span class="token keyword">try</span><span class="token punctuation">:</span>
                self<span class="token punctuation">.</span>tag_config<span class="token punctuation">(</span>acr_tag<span class="token punctuation">,</span>foreground<span class="token operator">=</span>f<span class="token punctuation">,</span>background<span class="token operator">=</span>b<span class="token punctuation">)</span>
            <span class="token keyword">except</span><span class="token punctuation">:</span>
                <span class="token keyword">return</span> <span class="token boolean">False</span><span class="token punctuation">,</span><span class="token string-interpolation"><span class="token string">f'颜色错误:</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>f<span class="token punctuation">}</span></span><span class="token string">或</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>b<span class="token punctuation">}</span></span><span class="token string">不符合颜色编码'</span></span>
            self<span class="token punctuation">.</span>insert<span class="token punctuation">(</span>self<span class="token punctuation">.</span>end<span class="token punctuation">,</span><span class="token string">'⚓'</span><span class="token punctuation">,</span>acr_tag<span class="token punctuation">)</span>
            self<span class="token punctuation">.</span>tag_bind<span class="token punctuation">(</span>acr_tag<span class="token punctuation">,</span><span class="token string">'<Enter>'</span><span class="token punctuation">,</span><span class="token keyword">lambda</span> e<span class="token punctuation">:</span>self<span class="token punctuation">.</span>config<span class="token punctuation">(</span>cursor<span class="token operator">=</span><span class="token string">'hand2'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
            self<span class="token punctuation">.</span>tag_bind<span class="token punctuation">(</span>acr_tag<span class="token punctuation">,</span><span class="token string">'<Leave>'</span><span class="token punctuation">,</span><span class="token keyword">lambda</span> e<span class="token punctuation">:</span>self<span class="token punctuation">.</span>config<span class="token punctuation">(</span>cursor<span class="token operator">=</span><span class="token string">'xterm'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
            self<span class="token punctuation">.</span>tag_bind<span class="token punctuation">(</span>acr_tag<span class="token punctuation">,</span><span class="token string">'<Button-1>'</span><span class="token punctuation">,</span><span class="token keyword">lambda</span> e<span class="token punctuation">:</span>self<span class="token punctuation">.</span>see<span class="token punctuation">(</span>mark<span class="token punctuation">)</span><span class="token punctuation">)</span>
            <span class="token keyword">return</span> <span class="token boolean">True</span><span class="token punctuation">,</span><span class="token string">''</span>
    <div class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li><li style="color: rgb(153, 153, 153);">2</li><li style="color: rgb(153, 153, 153);">3</li><li style="color: rgb(153, 153, 153);">4</li><li style="color: rgb(153, 153, 153);">5</li><li style="color: rgb(153, 153, 153);">6</li><li style="color: rgb(153, 153, 153);">7</li><li style="color: rgb(153, 153, 153);">8</li><li style="color: rgb(153, 153, 153);">9</li><li style="color: rgb(153, 153, 153);">10</li><li style="color: rgb(153, 153, 153);">11</li></ul></pre> 
    <blockquote> 
     <p>以上也是省略代码,但主要看逻辑。</p> 
     <p>f、b分别且前景色、背景色。</p> 
    </blockquote> 
    <p>很简单,那就是添加一个“⚓”,然后绑定一些事件。</p> 
    <p>值得注意的是,我们不能够先行确定标记。因为这个标记不一定存在于当前已经渲染完成的内容。当然,如果使用python编写的话,先不先获取标记,无伤大雅。但是在标记语言中就不同了。</p> 
    <h3><a name="t5"></a><a id="Tin_90"></a>Tin层面</h3> 
    <p>Tin中,使用<code><acr></code>标签添加锚点。这个锚点可以在任意位置。因为hi要在点击时,才会去锁定对应标记。</p> 
    <p>根据之前的一段标记文本段,继续完善:</p> 
    <pre data-index="4" class="set-code-hide prettyprint"><code class="prism language-tin has-numbering" onclick="mdcp.signin(event)" style="position: unset;"><title>标记测试
    <main>随便什么内容
    <sp>3
    <middle>右边是一个锚点👉 
    <acr>tag2
    <sp>5
    
    <main>下面一行的开头有一个标记
    <mark>tag1
    <sp>3
    
    <middle>本文末尾有一个tag2
    <mark>tag2
    <sp>3
    
    <middle>本文末尾有一个tag3
    <mark>tag3
    <sp>
    
    ;下面省略
    <div class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><div class="hide-preCode-box"><span class="hide-preCode-bt" data-report-view="{"spm":"1001.2101.3001.7365"}"><img class="look-more-preCode contentImg-no-view" src="https://1000bd.com/contentImg/2022/06/27/191644837.png" alt="" title=""></span></div><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li><li style="color: rgb(153, 153, 153);">2</li><li style="color: rgb(153, 153, 153);">3</li><li style="color: rgb(153, 153, 153);">4</li><li style="color: rgb(153, 153, 153);">5</li><li style="color: rgb(153, 153, 153);">6</li><li style="color: rgb(153, 153, 153);">7</li><li style="color: rgb(153, 153, 153);">8</li><li style="color: rgb(153, 153, 153);">9</li><li style="color: rgb(153, 153, 153);">10</li><li style="color: rgb(153, 153, 153);">11</li><li style="color: rgb(153, 153, 153);">12</li><li style="color: rgb(153, 153, 153);">13</li><li style="color: rgb(153, 153, 153);">14</li><li style="color: rgb(153, 153, 153);">15</li><li style="color: rgb(153, 153, 153);">16</li><li style="color: rgb(153, 153, 153);">17</li><li style="color: rgb(153, 153, 153);">18</li><li style="color: rgb(153, 153, 153);">19</li><li style="color: rgb(153, 153, 153);">20</li></ul></pre> 
    <p>效果如下:<br> <img src="https://1000bd.com/contentImg/2023/10/27/110256269.gif" alt="在这里插入图片描述"></p> 
    <hr> 
    <h2><a name="t6"></a><a id="_124"></a>结语</h2> 
    <p>tkinter文本框的功能拓展远不只此,更多新奇的方法也在不断被开发。</p> 
    <p>🔆tkinter创新🔆</p>
                    </div>
                        </div>
                    </li>
    
                    <li class="list-group-item ul-li">
    
                        <b>相关阅读:</b><br>
                        <nobr>
    <a href="/Article/Index/1062736">PHP获取访问浏览器的唯一标识useragent,判断是不是oppo内置浏览器</a>                            <br />
    <a href="/Article/Index/1723943">ASP.NET Core 6.0 使用 资源过滤器和行为过滤器</a>                            <br />
    <a href="/Article/Index/1290350">CAD for JS:VectorDraw web library 10.1004.1 Crack</a>                            <br />
    <a href="/Article/Index/1162366">elasticsearch启动失败,报错 ObjectIdentifier() -- data isn‘t an object ID (tag = 48)</a>                            <br />
    <a href="/Article/Index/1470034">电磁场与电磁波part5--均匀平面波在无界空间的传播</a>                            <br />
    <a href="/Article/Index/866773">什么是vue单向数据流(详解)</a>                            <br />
    <a href="/Article/Index/671540">扬帆牧哲——虾皮电商怎么运营好?</a>                            <br />
    <a href="/Article/Index/1674318">【JAVA】MyBatis-Plus插入/更新数据时如何自动更新字段时间</a>                            <br />
    <a href="/Article/Index/1185739">3.14 我总结的一些小红书笔记发布频率技巧!【玩赚小红书】</a>                            <br />
    <a href="/Article/Index/728760">shell命令梳理</a>                            <br />
                        </nobr>
                    </li>
                    <li class="list-group-item from-a mb-2">
                        原文地址:https://blog.csdn.net/tinga_kilin/article/details/126320771
                    </li>
    
                </ul>
            </div>
    
            <div class="col-lg-4 col-sm-12">
                <ul class="list-group" style="word-break:break-all;">
                    <li class="list-group-item ul-li-bg" aria-current="true">
                        最新文章
                    </li>
                    <li class="list-group-item ul-li">
                        <nobr>
    <a href="/Article/Index/1484446">攻防演习之三天拿下官网站群</a>                            <br />
    <a href="/Article/Index/1515268">数据安全治理学习——前期安全规划和安全管理体系建设</a>                            <br />
    <a href="/Article/Index/1759065">企业安全 | 企业内一次钓鱼演练准备过程</a>                            <br />
    <a href="/Article/Index/1485036">内网渗透测试 | Kerberos协议及其部分攻击手法</a>                            <br />
    <a href="/Article/Index/1877332">0day的产生 | 不懂代码的"代码审计"</a>                            <br />
    <a href="/Article/Index/1887576">安装scrcpy-client模块av模块异常,环境问题解决方案</a>                            <br />
    <a href="/Article/Index/1887578">leetcode hot100【LeetCode 279. 完全平方数】java实现</a>                            <br />
    <a href="/Article/Index/1887512">OpenWrt下安装Mosquitto</a>                            <br />
    <a href="/Article/Index/1887520">AnatoMask论文汇总</a>                            <br />
    <a href="/Article/Index/1887496">【AI日记】24.11.01 LangChain、openai api和github copilot</a>                            <br />
                        </nobr>
                    </li>
                </ul>
    
                <ul class="list-group pt-2" style="word-break:break-all;">
                    <li class="list-group-item ul-li-bg" aria-current="true">
                        热门文章
                    </li>
                    <li class="list-group-item ul-li">
                        <nobr>
    <a href="/Article/Index/888177">十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!</a>                            <br />
    <a href="/Article/Index/797680">奉劝各位学弟学妹们,该打造你的技术影响力了!</a>                            <br />
    <a href="/Article/Index/888183">五年了,我在 CSDN 的两个一百万。</a>                            <br />
    <a href="/Article/Index/888179">Java俄罗斯方块,老程序员花了一个周末,连接中学年代!</a>                            <br />
    <a href="/Article/Index/797730">面试官都震惊,你这网络基础可以啊!</a>                            <br />
    <a href="/Article/Index/797725">你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法</a>                            <br />
    <a href="/Article/Index/797702">心情不好的时候,用 Python 画棵樱花树送给自己吧</a>                            <br />
    <a href="/Article/Index/797709">通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!</a>                            <br />
    <a href="/Article/Index/797716">13 万字 C 语言从入门到精通保姆级教程2021 年版</a>                            <br />
    <a href="/Article/Index/888192">10行代码集2000张美女图,Python爬虫120例,再上征途</a>                            <br />
                        </nobr>
                    </li>
                </ul>
    
            </div>
        </div>
    </div>
    <!-- 主体 -->
    
    
        <!--body结束-->
        <!--这里是footer模板-->
        
        <!--footer-->
    <nav class="navbar navbar-inverse navbar-fixed-bottom">
        <div class="container">
            <div class="row">
                <div class="col-md-12">
                    <div class="text-muted center foot-height">
                        Copyright © 2022 侵权请联系<a href="mailto:2656653265@qq.com">2656653265@qq.com</a>   
                        <a href="https://beian.miit.gov.cn/" target="_blank">京ICP备2022015340号-1</a>
                    </div>
                    <div style="width:300px;margin:0 auto; padding:0px 5px;">
                        <a href="/regex.html">正则表达式工具</a>
                        <a href="/cron.html">cron表达式工具</a>
                        <a href="/pwdcreator.html">密码生成工具</a>
                    </div>
                    <div style="width:300px;margin:0 auto; padding:5px 0;">
                        <a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010502049817" style="display:inline-block;text-decoration:none;height:20px;line-height:20px;">
                        <img src="" style="float:left;" /><p style="float:left;height:20px;line-height:20px;margin: 0px 0px 0px 5px; color:#939393;">京公网安备 11010502049817号</p></a>
                    </div>
                </div>
            </div>
        </div>
      
    </nav>
    <!--footer-->
    
        <!--footer模板结束-->
    
        <script src="/js/plugins/jquery/jquery.js"></script>
        <script src="/js/bootstrap.min.js"></script>
    
        <!--这里是scripts模板-->
        
    
        
     
    
    
        <!--scripts模板结束-->
    
    </body>
    </html>