+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

如何在wx.stc.StyledTextEvent中捕获文本更改并在出现禁止的字符时更新显示

发布于2021-02-28 17:35     阅读(845)     评论(0)     点赞(16)     收藏(5)


0

1

2

3

4

5

6

7

我正在尝试阻止所有不是基本拉丁语(BASIC LATIN)的字符,并且我在wxpython中使用了STC。问题是我试图将某些事件与STC绑定在一起,但是没有适合于此目的的事件。

文档中的这些事件均无法识别-wx.stc事件 我也尝试了EVT_TEXT,该方法适用于wx.TextCtrl,但不起作用。

我想尝试与wx.TextCtrl类似的事情:

import wx
 
class MyForm(wx.Frame):


def __init__(self):
    wx.Frame.__init__(self, None, wx.ID_ANY, "Char Event Tutorial")

    # Add a panel so it looks the correct on all platforms
    panel = wx.Panel(self, wx.ID_ANY)
    self.btn = wx.TextCtrl(panel, value="")
    self.btn.Bind(wx.EVT_KEY_DOWN, self.onCharEvent)
    self.btn.Bind(wx.EVT_TEXT, self.forbidChar)


def forbidChar(self, event):
    ## function which should forbid non Latin chars
    print("VALUE: ", self.btn.GetValue())
    
def onCharEvent(self, event):
    
    event.Skip()
    
# Run the program
if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MyForm()
    frame.Show()
    app.MainLoop()

我可以实现一个线程,该线程将使用STC中的GetValue(),并且如果识别出非拉丁字符的更改,则应该设置SetValue(data),其中数据是已删除非拉丁字符的内容。

任何的想法?


解决方案


您可能需要看一下该string函数。

>>> import string
>>> string.__all__
['ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace', 'Formatter', 'Template']

简单地说,是这样的:

import wx
import string
valid = string.printable

class MyForm(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Char Event Tutorial")
    
        panel = wx.Panel(self, wx.ID_ANY)
        self.btn = wx.TextCtrl(panel, value="")
        self.btn.Bind(wx.EVT_TEXT, self.forbidChar)
    
    
    def forbidChar(self, event):
        ## function which should forbid non Latin chars
        text = self.btn.GetValue()
        try:
            char = text[-1]
        except IndexError:
            return
        if char not in valid:
            text = text[:-1]
            wx.MessageBox("Non Latin character", "Error")
            self.btn.Clear()
            self.btn.write(text)
        
# Run the program
if __name__ == "__main__":
    app = wx.App()
    frame = MyForm()
    frame.Show()
    app.MainLoop()

0

1

2

3

4

5

6



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/864097/28c117f163b37383d9f9/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

16 0
收藏该文
已收藏

评论内容:(最多支持255个字符)