I am using python 3.4.4 and tkinter ttk
..currently trying to implement line number
widget with my ttk notebook
widget but not giving me error neither printing line number..its working fine with single Text
widget... I surely made a mistake but I am not able to fix it thanks for helping me.
import tkinter.ttk as ttks
from tkinter import LEFT,RIGHT,X,Y,BOTH
class MainUI:
def __init__(self,master):
self.master = master
self.txs = []
self.linenumber = ttks.tkinter.Canvas(self.master,border=0,width=25,bg="#808b96")
self.linenumber.pack(side=LEFT,fill=Y)
self.nb = ttks.Notebook(self.master)
self.nb.pack(fill='both',expand=1)
self.add_tabs()
self._orig = self.txs[self.nb.index('current')]._w +"_orig"
self.master.call("rename",self.txs[self.nb.index('current')]._w,self._orig)
self.master.createcommand(self.txs[self.nb.index('current')]._w,self._proxy)
self.master.bind('<Control-n>',self.add_tabs)
def add_tabs(self,event=None):
self.page_name = ttks.Frame(self.nb)
self.tx = ttks.tkinter.Text(self.page_name)
self.txs.append(self.tx)
self.tx.pack(fill=BOTH,expand=1)
self.nb.add(self.page_name,text="pagename")
def redraw(self):
self.linenumber.delete("all")
i = self.txs[self.nb.index('current')].index("@0,0")
while True:
dline = self.txs[self.nb.index('current')].dlineinfo(i)
if dline is None: break
y = dline[1]
linenum = str(i).split(".")[0]
self.linenumber.create_text(2,y,anchor="nw",text=linenum)
i = self.txs[self.nb.index('current')].index("%s+1line"%i)
def _proxy(self,*args):
try:
cmd = (self._orig,)+args
result = self.master.call(cmd)
if (args[0] in ("insert","replace","delete") or
args[0:3] in ("mark","set","insert") or
args[0:2] in ("xview","moveto") or
args[0:2] in ("xview","scroll") or
args[0:2] in ("yview","moveto") or
args[0:2] in ("yview","scroll")
):
self.txs[self.nb.index('current')].event_generate("<<Change>>",when="tail")
return result
except:
pass
def Onchange(self,event):
self.redraw()
I forgot to Bind Onchange
method.
self.txs[self.nb.index('current')].bind("<<Change>>",self.Onchange)
self.txs[self.nb.index('current')].bind("<Configure>",self.Onchange)