Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # line_number_to_text_widget.py
- import Tkinter as tk
- class CustomText(tk.Text):
- def __init__(self, *args, **kwargs):
- tk.Text.__init__(self, *args, **kwargs)
- # create a proxy for the underlying widget
- self._orig = self._w + "_orig"
- self.tk.call("rename", self._w, self._orig)
- self.tk.createcommand(self._w, self._proxy)
- def _proxy(self, *args):
- # let the actual widget perform the requested action
- cmd = (self._orig,) + args
- result = self.tk.call(cmd)
- # generate an event if something was added or deleted,
- # or the cursor position changed
- if (args[0] in ("insert", "replace", "delete") or
- args[0:3] == ("mark", "set", "insert") or
- args[0:2] == ("xview", "moveto") or
- args[0:2] == ("xview", "scroll") or
- args[0:2] == ("yview", "moveto") or
- args[0:2] == ("yview", "scroll")
- ):
- self.event_generate("<<Change>>", when="tail")
- # return what the actual widget returned
- return result
- class TextLineNumbers(tk.Canvas):
- def __init__(self, *args, **kwargs):
- tk.Canvas.__init__(self, *args, **kwargs)
- self.textwidget = None
- def attach(self, text_widget):
- self.textwidget = text_widget
- def redraw(self, *args):
- '''redraw line numbers'''
- self.delete("all")
- i = self.textwidget.index("@0,0")
- while True :
- dline= self.textwidget.dlineinfo(i)
- if dline is None: break
- y = dline[1]
- linenum = str(i).split(".")[0]
- self.create_text(2,y,anchor="nw", text=linenum)
- i = self.textwidget.index("%s+1line" % i)
- class Example(tk.Frame):
- def __init__(self, *args, **kwargs):
- tk.Frame.__init__(self, *args, **kwargs)
- self.text = CustomText(self)
- self.vsb = tk.Scrollbar(orient="vertical", command=self.text.yview)
- self.text.configure(yscrollcommand=self.vsb.set)
- self.text.tag_configure("bigfont", font=("Helvetica", "24", "bold"))
- self.linenumbers = TextLineNumbers(self, width=30)
- self.linenumbers.attach(self.text)
- self.vsb.pack(side="right", fill="y")
- self.linenumbers.pack(side="left", fill="y")
- self.text.pack(side="right", fill="both", expand=True)
- self.text.bind("<<Change>>", self._on_change)
- self.text.bind("<Configure>", self._on_change)
- self.text.insert("end", "one\ntwo\nthree\n")
- self.text.insert("end", "four\n",("bigfont",))
- self.text.insert("end", "five\n")
- def _on_change(self, event):
- self.linenumbers.redraw()
- if __name__ == "__main__":
- root = tk.Tk()
- Example(root).pack(side="top", fill="both", expand=True)
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement