python简单代码编辑全过程-Tkinter制作简单的python编辑器

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

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

实现效果为:

729758-20170506154939101-889864204.png

其中主要思路就是在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())

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值