#1
  1. No Profile Picture
    Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Oct 2004
    Location
    Isle of dogs
    Posts
    68
    Rep Power
    11

    Smile Migrating to wxPython from TKinter


    Interested in wxPython but I cannot find what I need concerning text highlighting or changing the colour of a word. You know! something like syntax highlighting

    If anyone can give me a simple Hello World application that uses a simple regular expression, like searching the wxStyledTextCtrl for any occurrences of Hello then highlight it blue and any occurrence of World and highlight it red.

    Or if you don't want to sweet it out for me, show me the wxStyledTextCtrol methods that are responsible for text highlighting and might show compatibility with regular expressions.

    For Tkinter I use a small loop. 'compile' equals the regular expression mystring equals string to be searched, in this case its a string from Tkinters Textwidget itself.

    self.iterator = re.finditer(compile,mystring)
    for match in self.iterator:
    highlight(self.editor,match,hit)

    #func Strap this baby to a Textwidget first
    def config_tags(text):
    btags = text.bindtags()
    text.bindtags(btags[1:] + btags[:1])
    text.tag_configure("hit",foreground="blue")
    text.tag_configure("hit1",foreground="red")

    #func highlights text widget based on regular expression match and a hit
    def highlight_all_text(text,match,hit):
    if match:
    regs = match.span()# regular expression, you know this
    first, last = regs
    pfirst = "1.0 + %d chars" % first
    plast = "1.0 + %d chars" % last
    text.tag_add(hit, pfirst, plast)# The magic happens here.
    text.yview_pickplace(pfirst)

  2. #2
  3. No Profile Picture
    Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Jan 2004
    Posts
    84
    Rep Power
    11
    I seem to recall that wxPython actually has a syntax highlighting widget as a standard. I dunno, I never used wxPython much, but that is one thing I remember. I'm not 100% sure on it though.
  4. #3
  5. Mini me.
    Devshed Novice (500 - 999 posts)

    Join Date
    Nov 2003
    Location
    Cambridge, UK
    Posts
    783
    Rep Power
    13
    wxStyledTextCtrl already has the ability to understand HTML type tags if you tell it to use an HTML lexer. The underlying scintilla core already supports many languages. All you have to do is tell it what language you are editing and what colour etc. you want tokens to be displayed with. It does the rest!

    So:
    1. Create a parent widget to hold the text widget
    2. Define a lexer
    3. Create the text widget and let it know what lexer to use
    4. Define the colour font etc for each (predefined by Scintilla) token.
    5. Copy the text into the widget with SetText()
    6. Let the user edit it!

    Here are some key code fragments to give you a flavour.
    Code:
    from wxPython.stc import *
    class Custom:
        #
        def __init__(self):
            self.defaultTabWidth = 4
            self.useTabs = 0
            self.lexerId = wxSTC_LEX_NULL
            self.rightMargin = 68
            self.breakChars = ' \t.,/\\<>?!@#$%^&*(){}[]+\'"'
        def getLexerId(self):
            return self.lexerId
        def getDefaultTabWidth(self):
            return self.defaultTabWidth
        def getUseTabs(self):
            return self.useTabs
        def getRightMargin(self):
            return self.rightMargin
        def getBreakChars(self):
            return self.breakChars
        def do_auto_indent(self, buffer, usingTabs, currentTabWidth):
            return 1
    
    class HtmlCustom(Custom):
        def __init__(self):
            Custom.__init__(self)
            self.defaultTabWidth = 4
            self.useTabs = 0
            self.lexerId = wxSTC_LEX_HTML
    ......
    And in the main class we have
            self.Text = wxStyledTextCtrl(id=wxID_WXFRAME1TEXT, name='Text',
                  parent=self.mainwindow, pos=wxPoint(0, 0), size=wxSize(623, 350),
                  style=0)
    ......
    
            self.fileCustom = HtmlCustom()
            self.Text.StyleSetSpec(wxSTC_STYLE_DEFAULT, "size:%d,face:%s" % (pb, face3))
            self.Text.StyleSetSpec(wxSTC_H_TAG, "size:%d,bold,face:%s,fore:#0000FF" % (pb+2, face1))
            self.Text.StyleSetSpec(wxSTC_H_TAGUNKNOWN, "face:%s,italic,fore:#FF0000,size:%d" % (face2, pb))
            self.Text.StyleSetSpec(wxSTC_H_ATTRIBUTE, "face:%s,bold,size:%d" % (face2, pb+2))
            self.Text.StyleSetSpec(wxSTC_H_ATTRIBUTEUNKNOWN, "face:%s,size:%d" % (face1, pb-1))
            self.Text.StyleSetSpec(wxSTC_H_COMMENT, "face:%s,size:%d,back:#ffff00" % (face1, pb-1))
            self.Text.StyleSetSpec(wxSTC_H_SCRIPT, "face:%s,size:%d" % (face1, pb-1))
    
            self.Text.SetUseTabs(self.fileCustom.getUseTabs())
            self.Text.currentTabWidth = self.fileCustom.getDefaultTabWidth()
            self.Text.SetTabWidth(self.fileCustom.getDefaultTabWidth())
            lexerId = self.fileCustom.getLexerId()
            self.Text.SetLexer(lexerId)
            self.Text.SetWrapMode(wxSTC_WRAP_WORD)
    I don't claim credit for the Custom class but you should see it is useful if you ever want your editor to display other code.

    The wxPython and wxWindows docs should take you further.
    http://wiki.wxpython.org/index.cgi/wxStyledTextCtrl
    If you need further info I suggest you look at the source code for the editors supplied with wxPython - it helped me.

    grim
    Last edited by Grim Archon; October 28th, 2004 at 05:21 PM.
  6. #4
  7. No Profile Picture
    Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Oct 2004
    Location
    Isle of dogs
    Posts
    68
    Rep Power
    11
    If what you say is true, most of my problems are gone, I wouldn't even need that o'riellly book on regular expressions that a bought last week. I did try the example but it require globel veriables that I did not have.

    I have been trying to find some useful documention on wxStyledTextCtrl. And it is virtually non excistent or comprised of a little more then a half baked Java doc style file with a long list of methods and function with one line comments.
  8. #5
  9. Mini me.
    Devshed Novice (500 - 999 posts)

    Join Date
    Nov 2003
    Location
    Cambridge, UK
    Posts
    783
    Rep Power
    13
    I didn't supply the full code, as I said it was just fragments. It didn't take 5 mins to write and is to some extent is work in progress

    I used the documentation that is supplied with boa constructor:
    http://sourceforge.net/project/showfiles.php?group_id=1909&package_id=1856&release_id=261502
    The wxPython doc is where the stc component is described.

    grim
  10. #6
  11. Mini me.
    Devshed Novice (500 - 999 posts)

    Join Date
    Nov 2003
    Location
    Cambridge, UK
    Posts
    783
    Rep Power
    13
    I just upgraded my Boa installation and found that using the control is much easier these days. So here is a quick sample based on the documentation supplied with Boa and self contained (you only need wxPython to run it).
    Code:
    #Boa:Frame:wxFrame1
    
    from wxPython.wx import *
    from wxPython.lib.anchors import LayoutAnchors
    from wxPython.stc import *
    htmlKeywords = '''a abbr acronym address applet area b base basefont bdo big blockquote
             body br button caption center cite code col colgroup dd del dfn dir
             div dl dt em fieldset font form frame frameset h1 h2 h3 h4 h5 h6
             head hr html i iframe img input ins isindex kbd label legend li link
             map menu meta noframes noscript object ol optgroup option p param
             pre q s samp script select small span strike strong style sub sup
             table tbody td textarea tfoot th thead title tr tt u ul var xml
             xmlns abbr accept-charset accept accesskey action align alink alt
             archive axis background bgcolor border cellpadding cellspacing char
             charoff charset checked cite class classid clear codebase codetype
             color cols colspan compact content coords data datafld dataformatas
             datapagesize datasrc datetime declare defer dir disabled enctype
             event face for frame frameborder headers height href hreflang hspace
             http-equiv id ismap label lang language leftmargin link longdesc
             marginwidth marginheight maxlength media method multiple name nohref
             noresize noshade nowrap object onblur onchange onclick ondblclick
             onfocus onkeydown onkeypress onkeyup onload onmousedown onmousemove
             onmouseover onmouseout onmouseup onreset onselect onsubmit onunload
             profile prompt readonly rel rev rows rowspan rules scheme scope
             selected shape size span src standby start style summary tabindex
             target text title topmargin type usemap valign value valuetype
             version vlink vspace width text password checkbox radio submit reset
             file hidden image public !doctype'''
    
    
    def create(parent):
        return wxFrame1(parent)
    
    [wxID_WXFRAME1, wxID_WXFRAME1STYLEDTEXTCTRL1,
    ] = map(lambda _init_ctrls: wxNewId(), range(2))
    
    class wxFrame1(wxFrame):
        def _init_ctrls(self, prnt):
            # generated method, don't edit
            wxFrame.__init__(self, id=wxID_WXFRAME1, name='', parent=prnt,
                  pos=wxPoint(496, 283), size=wxSize(610, 522),
                  style=wxDEFAULT_FRAME_STYLE, title='wxFrame1')
            self.SetClientSize(wxSize(602, 488))
    
            self.styledTextCtrl1 = wxStyledTextCtrl(id=wxID_WXFRAME1STYLEDTEXTCTRL1,
                  name='styledTextCtrl1', parent=self, pos=wxPoint(0, 0),
                  size=wxSize(602, 488), style=0)
            self.styledTextCtrl1.SetLexer(wxSTC_LEX_HTML)
            self.styledTextCtrl1.Show(True)
            self.styledTextCtrl1.SetConstraints(LayoutAnchors(self.styledTextCtrl1,
                  True, True, False, False))
            self.styledTextCtrl1.SetViewEOL(True)
    
        def __init__(self, parent):
            self._init_ctrls(parent)
            self.styledTextCtrl1.StyleSetSpec(wxSTC_H_TAG, "size:%d,bold,face:%s,fore:#0000FF" % (26, 'Arial'))
            self.styledTextCtrl1.StyleSetSpec(wxSTC_H_ATTRIBUTE, "size:%d,bold,face:%s,fore:#DD00FF" % (16, 'Arial'))
            self.styledTextCtrl1.StyleSetSpec(wxSTC_H_ATTRIBUTEUNKNOWN, "size:%d,bold,face:%s,fore:#FFEE00" % (26, 'Arial'))
            self.styledTextCtrl1.SetKeyWords(0,htmlKeywords)
            self.styledTextCtrl1.SetText('''<h1 color="red" bad_attrib="ahha">hello cruel world</h1>''')
    
    
    
    class BoaApp(wxApp):
        def OnInit(self):
            wxInitAllImageHandlers()
            self.main = create(None)
            self.main.Show()
            self.SetTopWindow(self.main)
            return True
    
    def main():
        application = BoaApp(0)
        application.MainLoop()
    
    if __name__ == '__main__':
        main()
    grim

IMN logo majestic logo threadwatch logo seochat tools logo