0

wx.TextCtrl内のファイルまたはフォルダーパスを検出(強調表示してマウスイベントを生成)するメカニズムはありますか?

URL検出にも同様のメカニズムがあります(style = wx.TE_AUTO_URLとwx.TE_RICHを使用)。

例:

「これは、TextCtrlでC:\ Temp \ Folder\temp.txtをパスとして検出する方法の例です。」

ありがとう、オメル。

4

1 に答える 1

0

私の知る限り、あなたが望むことをする組み込みのスタイルはありません。ただし、いつでも wx.TextCtrl をサブクラス化できます。

以下に示すカスタム ウィジェットは、正規表現に一致する文字列サブセクションのスタイルを変更します。これらの部分文字列のいずれかにカーソルを合わせると、カスタム コマンド イベント「EVT_TXT_PATH」が生成されます。

コントロールに認識させたいパスに応じて、正規表現を調整する必要がある場合があります。正規表現ライブラリから、あなたに役立つかもしれないものをつかみました:

http://regexlib.com/REDetails.aspx?regexp_id=127

import wx
import wx.lib.newevent

import re

re_path = re.compile(r'([A-Z]:\\[^/:\*\?<>\|]+\.\w{2,6})|(\\{2}[^/:\*\?<>\|]+\.\w{2,6})')

TextPathEvent, EVT_TXT_PATH = wx.lib.newevent.NewCommandEvent()

class PathTextCtrl(wx.TextCtrl):

    def __init__(self, parent, id=wx.ID_ANY, value="",
                 pos=wx.DefaultPosition, size=wx.DefaultSize,
                 style=0, validator=wx.DefaultValidator,
                 name=""):

        style = style | wx.TE_RICH

        super(PathTextCtrl, self).__init__(parent, id, value, pos, size,
                                           style,validator, name)

        self.groups = []

        self.SetDefaultStyle(wx.TextAttr(wx.BLACK, wx.NullColor))

        self.Bind(wx.EVT_TEXT, self.OnText, self)
        self.Bind(wx.EVT_MOTION, self.OnMotion, self)

    def OnText(self, evt):

        self.StyleText()

        evt.Skip()

    def StyleText(self):

        self.groups = []

        string = self.GetValue()
        n = len(string)

        defstyle = self.GetDefaultStyle()
        self.SetStyle(0, n, defstyle)

        font = self.GetFont()
        font.SetUnderlined(True)
        style = wx.TextAttr(colText=wx.BLUE, font=font)       

        index = 0

        while True:

            match = re_path.search(string, index, n)

            if match:

                start, end = match.span()

                self.groups.append((start, end))

                self.SetStyle(start, end, style)

                index = end+1

            else: return

    def OnMotion(self, evt):

        pos = evt.GetPosition()

        result = self.HitTestPos(pos)

        for group in self.groups:

            x, y = group

            if x <= result[1] <= y:

                string = self.GetValue()[x:y]

                print string

                event = TextPathEvent(id=self.GetId(), url=string)

                wx.PostEvent(self, event)

        evt.Skip()

class TestFrame(wx.Frame):

    def __init__(self, parent, id=wx.ID_ANY, title=""):

        super(TestFrame, self).__init__(parent, id, title)

        panel = wx.Panel(self)

        text = PathTextCtrl(panel, size=(400, -1))

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(text, 0, wx.ALL, 10)
        panel.SetSizer(sizer)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(panel)
        self.SetSizer(sizer)

        self.Fit()

if __name__ == '__main__':

    app = wx.App(redirect=True)
    top = TestFrame(None, title="PathTextCtrl Demonstration")
    top.Show()
    app.MainLoop()
于 2012-04-29T17:24:00.183 に答える