wx.TextCtrl内のファイルまたはフォルダパスを検出(ハイライトしてマウスイベントを生成)するメカニズムはありますか?wx.TextCtrl内のファイルまたはフォルダパスの自動検出
同様のメカニズムがURL検出用に存在します(style = wx.TE_AUTO_URLとwx.TE_RICHを使用)。
例:
"これは私がTextCtrlがCを検出する方法の例です:パスとして\一時は\フォルダ\ TEMP.TXTを"
ありがとう、オマー。
wx.TextCtrl内のファイルまたはフォルダパスを検出(ハイライトしてマウスイベントを生成)するメカニズムはありますか?wx.TextCtrl内のファイルまたはフォルダパスの自動検出
同様のメカニズムがURL検出用に存在します(style = wx.TE_AUTO_URLとwx.TE_RICHを使用)。
例:
"これは私がTextCtrlがCを検出する方法の例です:パスとして\一時は\フォルダ\ TEMP.TXTを"
ありがとう、オマー。
私の知る限りでは、あなたが望むことをするビルトインスタイルはありません。しかし、いつでもwx.TextCtrlをサブクラス化することができます。
下記のカスタムウィジェットは、正規表現に一致する文字列サブセクションのスタイルを変更します。カーソルがこれらの部分文字列のいずれかの上を移動すると、カスタムコマンドイベント "EVT_TXT_PATH"が生成されます。
正規表現は、コントロールに認識させるパスによって調整が必要な場合があります。 私はあなたのために働くかもしれない正規表現ライブラリから1をつかん:
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()