Tkinter制作简单的python编辑器

Tkinter制作简单的python编辑器

想要制作简单的python脚本编辑器,其中文字输入代码部分使用Tkinter中的Text控件即可实现。

但是问题是,如何实现高亮呢?参考python自带的编辑器:python27/vidle文件夹中的代码。

实现效果为:

<span>Tkinter制作简单的python编辑器</span>

其中主要思路就是在Text中每输入一行代码,都通过正则匹配,查找是不是需要高亮效果,道理很简单,但是问题就是在使用Text控件的时候,通过光标输入的时候,似乎不能找到光标对应的位置,所以,人家的编辑器代码中,提供了WidgetRedirector.py文件,其作用主要是解决控件的输入操作执行Tk库里面的insert,而跳过了Tkinter库对应Text类中的insert函数。

该类的作用就是使用register函数注册insert的函数funtion,当往Text输入时,调用了funtion,然后从这个funtion中,即可得到文字输入的位置,而原始的insert函数中,往Text书写的操作,是通过该文件中的OriginalCommand类实现的。

其中的

WidgetRedirector类和OriginalCommand类直接拷贝即可。

而颜色高亮主要在ColorDelegator.py文件中实现,可以使用其中的正则表达式。

实现Text高亮的部分为:

class Test(object):
    def __init__(self,parent):
        self.parent = parent
        self.text = Text(self.parent)
        self.text.pack()
        self.text.focus_set()
        self.redir = WidgetRedirector(self.text)
        self.redir.insert  = self.redir.register("insert", self.m_insert)
        self.redir.delete  = self.redir.register("delete", self.m_delete)
        self.prog = prog
        
        self.tagdefs = {'COMMENT': {'foreground': '#dd0000', 'background': '#ffffff'}, 'DEFINITION': {'foreground': '#0000ff', 'background': '#ffffff'}, 'BUILTIN': {'foreground': '#900090', 'background': '#ffffff'}, 'hit': {'foreground': '#ffffff', 'background': '#000000'}, 'STRING': {'foreground': '#00aa00', 'background': '#ffffff'}, 'KEYWORD': {'foreground': '#ff7700', 'background': '#ffffff'}, 'ERROR': {'foreground': '#000000', 'background': '#ff7777'}, 'TODO': {'foreground': None, 'background': None}, 'SYNC': {'foreground': None, 'background': None}, 'BREAK': {'foreground': 'black', 'background': '#ffff55'}}
        
        for tag, cnf in self.tagdefs.items():
            if cnf:
                self.text.tag_configure(tag, **cnf)
                

    def m_delete(self, index1, index2=None):
        index1 = self.text.index(index1)
        self.redir.delete(index1, index2)  
        self.notify_range(index1,index1)
        
    def m_insert(self, index, chars, *args):
        index = self.text.index(index)   
        self.redir.insert(index, chars, *args)       
        self.notify_range(index, index + "+%dc" % len(chars))
        
    def notify_range(self, index1, index2=None):
        first = index1[0]+'.0'
        line = self.text.get(first, index2)
        
        for tag in self.tagdefs.keys():
            self.text.tag_remove(tag, first, index2)
        chars = line
        m = self.prog.search(chars)
        
        while m:
            for key, value in m.groupdict().items():
                if value:
                    a, b = m.span(key)
                    self.text.tag_add(key,
                                 first + "+%dc" % a,
                                 first + "+%dc" % b)
                    
            m = self.prog.search(chars, m.end())

 由此即可完成简单的编辑器。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119495.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android刘海屏适配(刘海屏或圆角适配)

    安卓P版本也就是刚发布的安卓9.0其中就加入了刘海屏相关的API。其相关行为与功能变更也是非常多的,从其变更的趋势及功能来看,google在进一步的收紧权限。其P版本变更行为中就加入了对非SDK接口使用的新限制。无论是直接,通过反射还是通过JNI。只要应用程序引用非SDK接口或尝试使用反射或JNI获取其句柄,就会应用这些限制。通常,应用程序应仅使用SDK中类的官方记录部分。特别是,这意味着…

    2022年4月10日
    172
  • c++如何将字符串转为数组(将字符串转换为数组)

    1.将字符串转为byte数组stringimgData=”….,…,….,….”;string[]imgArr=imgData.Split(newchar[]{‘,’});byte[]bty=Array.ConvertAll(imgArr,delegate(strings){returnbyte.Parse(s);});2.将byte数组转为字符串主要…

    2022年4月14日
    284
  • 地理加权回归模型_arcgis栅格数据归一化0到1

    地理加权回归模型_arcgis栅格数据归一化0到1(再次接近6000字,诚意满满啊)从这一章开始进入实际操作环节……首先还是用ArcGIS,毕竟这个东西比较容易。实际上要说起来,GWR有专门的软件,叫做GWR,但是这个软件暂时我还没有用过,所以等我先学习一下,把他放到最后才说了,先用比较熟悉的,比如ArcGIS、比如R语言,这些来讲讲(还有一个我非常熟悉的软件是GEODA,可惜GEODA仅支持回归分析,不支持地理加权回归)。

    2022年10月7日
    3
  • Python实现自动发送邮件(详解)

    Python实现自动发送邮件(详解)Python实现自动发送邮件1.开启SMTP服务为了实现自动发送邮件的目的,我们需要在邮箱中开启SMTP服务:这点很关键,别忘了去开启SMTP,别忘了去开启SMTP,否则邮件是无法发送成功的。然后你还需要点击下面生成授权码,这个授权码才是使用Python发送邮件时的真正密码。2.python发邮件需要掌握两个模块smtplib和email,这俩模块是python自带的,只需import即可使用。smtplib模块主要负责发送邮件,email模块主要负责构造邮件。smtplib模块主要

    2025年7月20日
    2
  • Java代码输出是“father”还是“child”(二)

    Java代码输出是“father”还是“child”(二)

    2022年2月6日
    45
  • java观看视频次数_java数字转换视频播放次数等

    java观看视频次数_java数字转换视频播放次数等1.1万、9999.9万、1.1亿、999亿+*播放量的数字显示规则1-9999,按照实际数字显示10000-9999999,按照1万、1.1万、9999.9万100000000-99900000000,按照1亿、1.1亿、999亿>99900000000,统一显示为999亿+所有数字显示均保留到小数点后一位即可“`java/***视频观看次数、评论数**@paramtimes*@…

    2022年7月8日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号