Search code examples
python-3.xtkintertkinter-canvasttk

Linenumber Widget with Notebook widget python ttk


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.

main.py

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

Solution

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