2012-04-29 56 views
0

是否有檢測(突出顯示並生成鼠標事件)wx.TextCtrl中的文件或文件夾路徑的機制?wx.TextCtrl中的自動檢測文件或文件夾路徑

URL檢測存在類似的機制(使用style = wx.TE_AUTO_URL和wx.TE_RICH)。

實施例:

「:\ TEMP \文件夾\ TEMP.TXT作爲路徑這是一個例子,我想如何TextCtrl檢測℃。」

謝謝,奧梅爾。

回答

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()