wx.TextCtrl内のファイルまたはフォルダーパスを検出(強調表示してマウスイベントを生成)するメカニズムはありますか?
URL検出にも同様のメカニズムがあります(style = wx.TE_AUTO_URLとwx.TE_RICHを使用)。
例:
「これは、TextCtrlでC:\ Temp \ Folder\temp.txtをパスとして検出する方法の例です。」
ありがとう、オメル。
私の知る限り、あなたが望むことをする組み込みのスタイルはありません。ただし、いつでも 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()