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()

python wx提示框字体_使用wxStyledTextCtrl实现代码提示相关推荐

  1. 调整idea中控制台及右侧提示框字体大小

    调整idea中控制台及右侧提示框字体大小

  2. 【机器视觉学习笔记】python安装OpenCV并设置自动补全及代码提示

    目录 安装 测试 设置自动补全及代码提示 平台:Windows 10 20H2 Python 3.8.12 (default, Oct 12 2021, 03:01:40) [MSC v.1916 6 ...

  3. python插件使用教程_Python Kite 使用教程 轻量级代码提示

    1: 概述 今天升级annacoda 插件 spyder  (4.0.0 )的时候 提示安装kite ,这是什么玩意? 下载下来试一试? 原来:就是一个代码提示插件.. 说白了" 就是让开发 ...

  4. python wx窗口无法关闭_菜鸟学Python,双手奉上老司机给上路新手总结的Python实战问题…...

    针对Python这一话题每天后台都会有不少小伙伴提出问题,下面我就将这些问题进行汇整,产出"Python实战问题篇",我认为这些问题非常具有代表性,希望可以帮到大家. 第一类问题: ...

  5. python 获取文本框内容_如何在python中单击按钮时获取文本框中的文本?

    我可以让您的代码在单击按钮时显示文本框中的文本: 这就是你要达到的目的吗?您没有提到是否出现错误,但我确实发现您的代码存在两个问题:Button.py脚本中似乎存在一些缩进问题.在 对于changeT ...

  6. java swing计算机_利用JAVA SWING 编程,要在当前窗体中显示如下信息提示框,则需要编写的代码...

    [单选题]在计算机网络中,通常把提供并管理共享资源的计算机称为 ( ) [单选题]计算机内部存储汉字,使用 ( ) . [单选题]一个ASCII码字符用几个 Byte 表示 () [单选题]运行Wor ...

  7. python word 表格 框线_用python解析word文件(段落篇(paragraph) 表格篇(table) 样式篇(style))...

    首先需要安装相应的支持库: 直接在命令行执行pip install python-docx 示例代码如下: import docx from docx import Document #导入库 pat ...

  8. python hello world程序编写_编写高质量代码 改善Python程序的91个建议

    建议1:理解Pythonic概念 建议2:编写Pythonic代码 建议3:理解Python与C语言的不同之处 建议4:在代码中适当添加注释 建议5:通过适当添加空行使代码布局更为优雅.合理 建议6: ...

  9. python有趣的面试题_一道3行代码的Python面试题,我懵逼了...|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时 ...

最新文章

  1. dojo从asp.net中获取json数据
  2. pandas 读取sqlserver_13个Pandas实用技巧,请收好
  3. cassandra java driver
  4. android studio m1,Android Studio 4.0发布 为Android 11做好准备
  5. boost::math::quadrature::tanh_sinh用法的测试程序
  6. MacBook(macOS) 如何安装 Homebrew Cask(作废)
  7. 广东计算机电子学校,广东省电子职业技术学校
  8. shell 进入hadoop_php通过shell调用Hadoop的方法
  9. 给Lisp程序员的Python简介
  10. LR9.10破解方法。
  11. ERP软件是什么意思,买菜大妈讲的通俗易懂
  12. epoch mysql_PostgreSQL: epoch 新纪元时间的使用
  13. WinSAT 系统评估工具使用
  14. 全球与中国汽车牛皮革市场“十四五”前景规划及运营趋势研究报告2022-2028年
  15. 爬虫实战-爬取豆瓣读书书籍信息
  16. 如何保护Java程序 防止Java反编译
  17. 数据库层次模型的优缺点
  18. C语言一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?
  19. win10开机有东西一闪而过_Win10 开机以后不一会儿会弹出一个黑框,usoclient.exe 一闪而过。这东西对电脑有...
  20. 使用钩子函数获取全部的鼠标消息和键盘消息

热门文章

  1. .NET架构开发应知应会
  2. 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:4. 设备上报属性
  3. .NET Core 性能分析: xUnit.Performance 简介
  4. 使用 mono 编译 .NET Standard 应用
  5. 大湾区第二次.NET技术交流会圆满成功
  6. 在Mac的Docker中运行DotNetCore2.0
  7. 编程语言的发展趋势及未来方向(2):声明式编程与DSL
  8. django20:BBS网页设计/注册功能/验证码代码
  9. onlyoffice启用HTTPS
  10. oracle 注册程序,oracle 静态注册