2012-04-29 4 views
0

Есть ли механизм, который обнаруживает (выделяет и генерирует событие мыши) файл или путь к папке в wx.TextCtrl?Autodetect путь к файлу или папке в wx.TextCtrl

Аналогичный механизм существует для обнаружения URL (с использованием стиля = wx.TE_AUTO_URL с wx.TE_RICH).

Пример:

": \ Temp \ Folder \ temp.txt как путь Это пример того, как я хочу, чтобы обнаружить TextCtrl C."

Спасибо, Омер.

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^