wxPython - 实现 wx.EVT_TEXT_PASTE

wxPython - implementing wx.EVT_TEXT_PASTE

我正在为我的文本框创建一个 wx.PyValidator:

class IPValidator(wx.PyValidator):
    "Validator for validating IP addresses"

    def __init__(self):
        super(IPValidator, self).__init__()
        self.Bind(wx.EVT_TEXT_PASTE, self.OnPaste)

    def Clone(self):
        """Cloning the validator"""
        return self.__class__()

    def Validate(self, win):
        """the validate function"""
        return self.OnValidate(self.GetWindow().GetValue())

    def OnValidate(self, text):
        """returns True or False about the given text"""
        return re.match(text, ip_pattern)

    def OnPaste(self, event): #######
        text = event.GetString()
        if self.OnValidate(text):
            event.Skip()

    def TransferToWindow(self):
        return True

    def TransferFromWindow(self):
        return True

我的 OnPaste 方法有问题。如何在粘贴之前获取粘贴的字符串并确保其有效? event.GetString returns 一个空字符串

你需要直接连接剪贴板

def get_clipboard_text():
    if not wx.TheClipboard.IsOpened(): wx.TheClipboard.Open()
    do = wx.TextDataObject()
    success = wx.TheClipboard.GetData(do)
    if success:
        return do.GetText()
    return ""

class MyWidget(...):
    ....
    def OnPaste(self, event): #######
        text = get_clipboard_text()
        if self.OnValidate(text):
            event.Skip()

是仅使用 wx 就可以做到的方法...但我建议使用 pyperclip 之类的东西,因为它更容易处理