diff options
Diffstat (limited to 'Demo/tkinter/guido/regexdemo.py')
-rw-r--r-- | Demo/tkinter/guido/regexdemo.py | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/Demo/tkinter/guido/regexdemo.py b/Demo/tkinter/guido/regexdemo.py new file mode 100644 index 0000000..89c9ee5 --- /dev/null +++ b/Demo/tkinter/guido/regexdemo.py @@ -0,0 +1,127 @@ +"""Basic regular expression demostration facility. + +This displays a window with two type-in boxes. In the top box, you enter a +regular expression. In the bottom box, you enter a string. The first +match in the string of the regular expression is highlighted with a yellow +background (or red if the match is empty -- then the character at the match +is highlighted). The highlighting is continuously updated. At the bottom +are a number of checkboxes which control the regular expression syntax used +(see the regex_syntax module for descriptions). When there's no match, or +when the regular expression is syntactically incorrect, an error message is +displayed. + +""" + +from Tkinter import * +import regex +import regex_syntax + +class RegexDemo: + + def __init__(self, master): + self.master = master + self.topframe = Frame(self.master) + self.topframe.pack(fill=X) + self.promptdisplay = Label(self.topframe, text="Enter a string:") + self.promptdisplay.pack(side=LEFT) + self.statusdisplay = Label(self.topframe, text="", anchor=W) + self.statusdisplay.pack(side=LEFT, fill=X) + self.regexdisplay = Entry(self.master) + self.regexdisplay.pack(fill=X) + self.regexdisplay.focus_set() + self.labeldisplay = Label(self.master, anchor=W, + text="Enter a string:") + self.labeldisplay.pack(fill=X) + self.labeldisplay.pack(fill=X) + self.stringdisplay = Text(self.master, width=60, height=4) + self.stringdisplay.pack(fill=BOTH, expand=1) + self.stringdisplay.tag_configure("hit", background="yellow") + self.addoptions() + self.regexdisplay.bind('<Key>', self.recompile) + self.stringdisplay.bind('<Key>', self.reevaluate) + self.compiled = None + self.recompile() + btags = self.regexdisplay.bindtags() + self.regexdisplay.bindtags(btags[1:] + btags[:1]) + btags = self.stringdisplay.bindtags() + self.stringdisplay.bindtags(btags[1:] + btags[:1]) + + def addoptions(self): + self.frames = [] + self.boxes = [] + self.vars = [] + for name in ( 'RE_NO_BK_PARENS', + 'RE_NO_BK_VBAR', + 'RE_BK_PLUS_QM', + 'RE_TIGHT_VBAR', + 'RE_NEWLINE_OR', + 'RE_CONTEXT_INDEP_OPS'): + if len(self.boxes) % 3 == 0: + frame = Frame(self.master) + frame.pack(fill=X) + self.frames.append(frame) + val = getattr(regex_syntax, name) + var = IntVar() + box = Checkbutton(frame, + variable=var, text=name, + offvalue=0, onvalue=val, + command=self.newsyntax) + box.pack(side=LEFT) + self.boxes.append(box) + self.vars.append(var) + + def newsyntax(self): + syntax = 0 + for var in self.vars: + syntax = syntax | var.get() + regex.set_syntax(syntax) + self.recompile() + + def recompile(self, event=None): + try: + self.compiled = regex.compile(self.regexdisplay.get()) + self.statusdisplay.config(text="") + except regex.error, msg: + self.compiled = None + self.statusdisplay.config(text="regex.error: %s" % str(msg)) + self.reevaluate() + + def reevaluate(self, event=None): + try: + self.stringdisplay.tag_remove("hit", "1.0", END) + except TclError: + pass + if not self.compiled: + return + text = self.stringdisplay.get("1.0", END) + i = self.compiled.search(text) + if i < 0: + self.statusdisplay.config(text="(no match)") + else: + self.statusdisplay.config(text="") + regs = self.compiled.regs + first, last = regs[0] + if last == first: + last = first+1 + self.stringdisplay.tag_configure("hit", + background="red") + else: + self.stringdisplay.tag_configure("hit", + background="yellow") + pfirst = "1.0 + %d chars" % first + plast = "1.0 + %d chars" % last + self.stringdisplay.tag_add("hit", pfirst, plast) + self.stringdisplay.yview_pickplace(pfirst) + + + +# Main function, run when invoked as a stand-alone Python program. + +def main(): + root = Tk() + demo = RegexDemo(root) + root.protocol('WM_DELETE_WINDOW', root.quit) + root.mainloop() + +if __name__ == '__main__': + main() |