2012-04-29 4 views
0

wx.TextCtrl에서 파일이나 폴더 경로를 감지 (강조 표시하고 마우스 이벤트를 생성)하는 메커니즘이 있습니까?wx.TextCtrl의 파일 또는 폴더 경로 자동 검색

비슷한 메커니즘이 wx.TE_RICH와 함께 style = wx.TE_AUTO_URL을 사용하여 URL을 탐지하기 위해 존재합니다.

예 :

"이것은 내가 TextCtrl이 C 감지하는 방법을 예는 다음과 같습니다. 경로로 \ 임시 \ 폴더 \의 TEMP.TXT을"

감사합니다.

답변

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() 
: 나는 당신을 위해 일 수있는 정규 표현식 라이브러리에서 하나를 잡고