python wx提示框字体_使用wxStyledTextCtrl实现代码提示

wxStyledTextCtrl是wxPython对流行的Scintilla的包装,Scintilla的网站(http://www.scintilla.org/),

wxStyledTextCtrl是一个功能强大的富文本编辑控件,常见的编辑器功能都能找到,包括代码高亮,搜索替换,拷贝粘贴,回退等,后续我将逐步提供说明和例子代码,以供大家参考。今天先说代码提示。

创建Frame

首先创建Frame,这个Frame由工具条和wxStyledTextCtrl组成。

class myFrame(wx.Frame):

def __init__(self,parent,title):

wx.Frame.__init__(self,parent,title=title,size=(800,600))

#创建工具条

tb=wx.Frame.CreateToolBar(self,style=wx.TB_FLAT|wx.TB_HORIZONTAL)

tb.AddTool(201,u"回退",wx.Bitmap("./icos/undo.bmp"))

tb.AddTool(202,u"重做",wx.Bitmap("icos/redo.bmp"))

tb.AddSeparator()

tb.AddTool(101,u"拷贝",wx.Bitmap("icos/copy.bmp"))

tb.AddTool(102,u"粘贴",wx.Bitmap("icos/paste.bmp"))

tb.AddTool(103,u"剪贴",wx.Bitmap("icos/cut.bmp"))

tb.AddTool(104,u"搜索",wx.Bitmap("icos/search.bmp"))

tb.Realize()

#在工具条下方创建StyledTextCtrl编辑控件

self.control=stc.StyledTextCtrl(self,style=0)

#创建一个用于代码提示的AutoComplete对象

self._autocomplete=AutoComplete()

#绑定工具条事件和处理函数

tb.Bind(wx.EVT_TOOL,self.OnToolSelected)

#绑定按键事件

self.control.Bind(wx.EVT_KEY_DOWN,self.OnKeyPressed)

self.control.Bind(wx.EVT_CHAR,self.OnChar)

self.Show(True)

因为代码提示是在键入的过程中发生的,所以需要跟踪键盘事件,所以把按键事件与处理函数做了绑定。

AutoComplete类

在代码提示过程中需要动态根据用户输入提供建议,所以创建了一个_autocomplete对象,它的类代码:

class AutoComplete:

def __init__(self):

self.suggests=keyword.kwlist

self.prefix=""

self.key=""

def append(self,char):

self.prefix+=char

def back(self):

if len(self.prefix)>1:

self.prefix=self.prefix[:-1]

else:

self.prefix=""

def clear(self):

self.prefix=""

@property

def length(self):

return len(self.prefix)

def getsugs(self):

return [word for word in self.suggests if word.startswith(self.prefix)]

这个类维护一个用户当前已输入的字符串,用户每输入一个字符都附加在字符串后面,每次输入退格键,字符串删掉最后的字符。getsugs()函数根据字符串在关键字列表中查找匹配的候选关键字,并返回一个推荐列表。

跟踪键盘事件

def OnKeyPressed(self,evt):

key=evt.GetKeyCode()

control=evt.ControlDown()

alt=evt.AltDown()

shift=evt.ShiftDown()

if key in self.AutoCompStopwords and not control and not alt and not shift:

if self.control.AutoCompActive():

self.control.AutoCompComplete()

self._autocomplete.clear()

elif key==wx.WXK_BACK and not control and not alt and not shift:

self._autocomplete.back()

self.code_complete()

evt.Skip()

def OnChar(self,evt):

control = evt.ControlDown()

alt = evt.AltDown()

shift = evt.ShiftDown()

try:

char = chr(evt.GetUnicodeKey())

if char.isprintable() and char!=" ":

self._autocomplete.append(char)

except ValueError:

#self._autocomplete.clear()

if self.control.AutoCompActive():

self.control.AutoCompCancel()

if not control and not alt and not shift:

self.code_complete()

evt.Skip()

我们提供了两个跟踪键盘事件的函数,它们之间还是有些区别的。主要目的是区分可打印字符与功能键。AutoCompStopwords就是指定遇到什么样的按键代码提示结束,常见的包括回车、空格、分号、点号等。代码提示结束有两种情况,一种是用户在列表中选择其中一项,填入到编辑器中,另一种是用户输入的内容匹配不到任何关键字。

每个处理函数后面都加上了evt.Skip()目的是不要打破系统的消息处理机制,使得系统有时间处理必要的消息。有点像以前VB时代的DoEvents。

在遇到AutoCompStopwords后,需要把_autocomplete中的字符串清空,等待下一个词的编辑。这两个事件处理代码中都调用了code_complete()函数,其代码:

def code_complete(self):

choices=self._autocomplete.getsugs()

if choices and self._autocomplete.length>=1:

choices.sort()

self.control.AutoCompShow(self._autocomplete.length-1," ".join(choices))

else:

if self.control.AutoCompActive():

self.control.AutoCompCancel()

就是获取推荐列表,并显示在编辑器中。AutoCompShow(nlength,suggents),其中第一个参数nlength是指匹配多少个字符开始显示,suggents是一个分隔符隔开的推荐列表字符串,分隔符可以设置,不过一般保持缺省就可以了,缺省是空格。

建立主程序

建立一个主程序的入口,并建立消息循环机制。这些都是wxPython的规定动作。

if __name__=="__main__":

app=wx.App(False)

frame=myFrame(None,'Simple Editor')

app.MainLoop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP5中PDO的简单使用

PDO(PHP Data Object) 是PHP 5新出来的东西,在PHP 6都要出来的时候,PHP 6只默认使用PDO来处理数据库,将把所有的数据库扩展移到了PECL,那么默认就是没有了我们喜爱的php_mysql.dll之类的了,那怎么办捏,我们…

redis在linux搭建集群,Linux/Centos 7 redis4 集群搭建

背景说明:项目初期使用AWS的ElastiCache Redis作为系统的数据缓存,近期由于数据量和QPS加大,导致Redis存在压力,进行了两次的单点垂直升级,缓解了目前的压力。项目组进行了数据和费用的评估,考虑到日后升级…

远程控制

我和舍友共用ADSL,我的电脑接在宽带路由器上面。为了能远程控制家里的电脑,我是煞费苦心,最后终于OK了,把一些经验心得写出来。 首先想要远程登录的机器最好是WinXP或者Win2003(据说Win2003更好一些,可以多用户同时登…

防SQL注入的最好实现方式是什么?

咨询区 LeonidasFett:我的问题是:如何在 C# 中是使用SQL防注入,我的模糊理解是可以通过限定应用程序接收的字段格式来实现最终目的,比如说:email字段只能接收email的格式,name字段不能输入特殊字符&#xf…

微软职位内部推荐-Senior SW Engineer for Application Ecosystem

微软近期Open的职位:Job posting title: Senior Development EngineerLocation: China, BeijingDivision: Operations System Group Engineering&nbsp Group OverviewOSG is delivering flagship products in Microsoft. China is a second largest economy in the world. …

数学除了摧残祖国的花朵外,竟然还可以赢钱!

全世界只有3.14 % 的人关注了爆炸吧知识端午节假期结束了,知识君又可以开心地回到工作岗位上了。我热爱学习,也热爱工作。这两天,知识君又听到了“哼,数学除了摧残我们这些祖国的花朵之外,然而并没有什么卵用。”知识君…

rocketmq 顺序消费_10 分钟看懂消息队列 RocketMQ

RocketMQ 是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于2017年9月25日成为 Apache 的顶级项目。作为经历过多次阿里巴巴双十一这种“超级工程”的洗礼并有稳定出色表现的国产中间件,以其高性能、低延时和…

[Tyvj1114 搭建双塔]

[题目来源]:VIjos [关键字]:动态规划 [题目大意]:用n块水晶搭建两个塔,要求双塔必须一样高,问最大能达到的高度为多少。 // [分析]:用f[i,j]表示使用前i个水晶,建起高度差为j的双塔时,较矮的那个塔的最大高…

echarts 时间曲线图_制作按时间每秒实时更新的echarts折线图

有时候我们的图表需要根据后台数据每秒实时更新,那么用echarts应该如何实现呢?2020.11.27发现篇文章很多人关注,但之前写的不是很清楚,今天更新下,大家有问题可以也留言讨论。这是一个仿win10任务管理器的设备信息监控…

linux lua socket编程,CentOs 安装lua,luasocket

一、centos安装Lua3)个人在这里选择使用5.1版本的*下载wget http://www.lua.org/ftp/lua-5.1.5.tar.gz--2013-10-14 16:23:17-- http://www.lua.org/ftp/lua-5.1.5.tar.gzResolving www.lua.org... 89.238.129.35, 2a02:40:41::5Connecting to www.lua.org|89.238.129.35|:80.…

Python 2.7 Tutorial —— 流程控制

.. _tut-morecontrol: ****************************************** More Control Flow Tools 深入流程控制 ****************************************** Besides the :keyword:while statement just introduced, Python knows the usual control flow statements known from …

一厕难求!NASA悬赏三万五千美元,只为一个能在月球上用的马桶

全世界只有3.14 % 的人关注了爆炸吧知识来源:大数据文摘作者:刘俊寰如今逐渐步入智能生活时代,智能化产品也逐渐普及到我们生活中,有的智能马桶,不仅可以识别大便监测你的生活状况,还可以识别肛纹辨别不同身…

我很高兴地宣布我正在编写第一本官方ABP图书

掌握ABP框架通过实施软件开发最佳实践来构建可维护的 .NET 解决方案从 ABP 框架的创建者那里学习如何构建现代 Web 应用程序主要特点使用 ABP 中的最佳工具构建强大、可维护和可扩展的软件解决方案了解如何在您的 Web 应用程序中实施 SOLID 原则和领域驱动设计了解 ABP 框架如何…

python join_python join 和 split的常用使用方法

python join 和 split的常用使用方法 python join 和 split方法的使用,join用来连接字符串,split恰好相反,拆分字符串的。 1.join用法示例 >>>li [my,name,is,bob] >>> .join(li) my name is bob >>>_.join(li) my_name_is_…

layui 如何去dom_javascript 怎么去引用layui里面的方法

现在,我有一个JSP页面,里面同时存在普通javascript的代码和layui的代码,我想调用layui里面的方法,该怎么引用?这是javascript代码:var treeSetting {data: {simpleData: {enable: true,idKey: "id&qu…

ExtJs Grid分页时序号自增的实现,以及查询以后的序号的处理

ExtJs Grid分页时,默认情况下每页的序号都是从1起始的,这往往不符合我们的习惯。这里实现了序号的自动增加。如:每页20条第一页从1开始,第二页从21条开始。先定义一个全局变量如record_start 0,这里记得赋初始值主要是考虑第一次…

linux的自定义input,linux键值到Android键值的转换与自定义

首先要确定按键输入设备是对应/dev/input目录下哪个event,根据VID PID匹配对应的kl文件,可通过如下命令 cat /proc/bus/input/devices 查看设备信息framework层通过.kl文件将获取的键值转换成实际按键含义后,又会通过KeycodeLabel转换成相应的…

原来历史人物的英文名竟然叫这些,太好笑了吧哈哈哈哈哈

全世界只有3.14 % 的人关注了爆炸吧知识我们学了这么多年的英语你有英文名字吗?如果有一天,古人穿越到了现在那么他们的英文名字是……汉武帝:Woody汉文帝:Wendy▽朱棣:judy▽朱熹:Juicy▽周瑜:…

10款优秀的跨平台免费生产力软件[转]

因为多数人并不需要OpenOffice.org那样整合了字处理、表格、幻灯片制作等完整的生产力工具,他们只需要其中一项功能:字处理软件AbiWord 2.8.6;开源桌面排版系统Scribus 1.3.8;整合浏览器、电子邮件、IRC和HTML编辑器的SeaMonkey 2…

From Apprentice To Artisan 翻译 19

为什么80%的码农都做不了架构师?>>> 上一篇 Interface Segregation Principle 接口隔离原则 Introduction 介绍 The Interface Segregation principle states that no implementation of an interface should be forced to depend on methods it does n…