2012-04-29 10 views
0

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

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

例:

"これは私がTextCtrlがCを検出する方法の例です:パスとして\一時は\フォルダ\ TEMP.TXTを"

ありがとう、オマー。

答えて

0

私の知る限りでは、あなたが望むことをするビルトインスタイルはありません。しかし、いつでも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() 
関連する問題