Q:

Python Gtk buttons

I am creating this sample tool with GUI, the code is working without any issue .However,there's one thing that I can't figure out is how can I make the buttons always appear on the center of the GUI doesn't matter 
how the GUI gets resized ? I've tried different ways to achieve but none of them work.Can someone please help me!!! Thank you so much in advance .
import gi
gi.require_version('Gtk','3.0')
from gi.repository import Gtk as gtk
import os

software_list = [("Firefox", 2002,  "C++"),
             ("Eclipse", 2004, "Java" ),
             ("Pitivi", 2004, "Python"),
             ("Netbeans", 1996, "Java"),
             ("Chrome", 2008, "C++"),
             ("Filezilla", 2001, "C++"),
             ("Bazaar", 2005, "Python"),
             ("Git", 2005, "C"),
             ("Linux Kernel", 1991, "C"),
             ("GCC", 1987, "C"),
             ("Frostwire", 2004, "Java")]

class WB_Window(gtk.Window):
     def __init__(self):
     gtk.Window.__init__(self, title="Write Blocker")
     self.set_border_width(10)
     self.set_position(gtk.WindowPosition.CENTER)
     self.set_default_size(1000, 450)

     self.outter_box = gtk.Box(gtk.Orientation.HORIZONTAL, spacing=10)
     self.outter_box.set_homogeneous(True)
     self.add(self.outter_box)

     grid = gtk.Grid()
     grid.set_row_spacing(10)
     grid.set_column_homogeneous(True)
     self.outter_box.add(grid)

    self.software_liststore = gtk.ListStore(str, int, str)
    for software_ref in software_list:
        self.software_liststore.append(list(software_ref))
    tree = gtk.TreeView(self.software_liststore)

    for i, column_title in enumerate(["Software", "Release Year", "Programming Language"]):
        renderer = gtk.CellRendererText()
        column = gtk.TreeViewColumn(column_title, renderer, text=i)
        tree.append_column(column)

    self.scrollable_treelist = gtk.ScrolledWindow()
    self.scrollable_treelist.set_vexpand(True)
    grid.add(self.scrollable_treelist)
    self.scrollable_treelist.add(tree)

    hbox = gtk.ButtonBox.new(gtk.Orientation.HORIZONTAL)
    hbox.set_homogeneous(True)
    valign = gtk.Alignment(xalign=1.0, yalign=1.0, xscale=1.0, yscale=1.0)
    hbox.pack_end(valign,False,False,0)
    grid_2 = gtk.Grid()

    grid.attach_next_to(grid_2,None,gtk.PositionType.BOTTOM,1,1)
    grid_2.add(hbox)

    button_mount = gtk.Button(label="Mount")
    hbox.add(button_mount)
    button_ro = gtk.Button(label="Read-Only")
    hbox.add(button_ro)
    button_rw = gtk.Button(label="Read-Write")
    hbox.add(button_rw)
    button_quit = gtk.Button(label="Quit",stock=gtk.STOCK_QUIT)
    button_quit.show()
    hbox.add(button_quit)

win = WB_Window()
win.connect("delete-event",gtk.main_quit)
win.show_all()
gtk.main()

A:

You have many redundant containers. Removed some:
import gi
gi.require_version('Gtk','3.0')
from gi.repository import Gtk as gtk
import os

software_list = [("Firefox", 2002,  "C++"),
             ("Eclipse", 2004, "Java" ),
             ("Pitivi", 2004, "Python"),
             ("Netbeans", 1996, "Java"),
             ("Chrome", 2008, "C++"),
             ("Filezilla", 2001, "C++"),
             ("Bazaar", 2005, "Python"),
             ("Git", 2005, "C"),
             ("Linux Kernel", 1991, "C"),
             ("GCC", 1987, "C"),
             ("Frostwire", 2004, "Java")]

class WB_Window(gtk.Window):
    def __init__(self):
        gtk.Window.__init__(self, title="Write Blocker")
        self.set_border_width(10)
        self.set_position(gtk.WindowPosition.CENTER)
        self.set_default_size(1000, 450)

        #self.outter_box = gtk.Box(gtk.Orientation.HORIZONTAL, spacing=10)
        self.outter_box = gtk.VBox(False,spacing=10)
        self.add(self.outter_box)

        self.software_liststore = gtk.ListStore(str, int, str)
        for software_ref in software_list:
            self.software_liststore.append(list(software_ref))
        tree = gtk.TreeView(self.software_liststore)

        for i, column_title in enumerate(["Software", "Release Year", "Programming Language"]):
            renderer = gtk.CellRendererText()
            column = gtk.TreeViewColumn(column_title, renderer, text=i)
            tree.append_column(column)

        self.scrollable_treelist = gtk.ScrolledWindow()
        self.scrollable_treelist.set_vexpand(True)
        self.scrollable_treelist.set_hexpand(True)
        self.outter_box.pack_start(self.scrollable_treelist, False, True, 0)
        self.scrollable_treelist.add(tree)

        hbox = gtk.ButtonBox.new(gtk.Orientation.HORIZONTAL)
        hbox.set_layout(gtk.ButtonBoxStyle.CENTER) 
        self.outter_box.pack_start(hbox, False, True, 0)

        # Add CSS "linked" class
        hbox.get_style_context().add_class("linked")

        button_mount = gtk.Button(label="Mount")
        hbox.add(button_mount)
        button_ro = gtk.Button(label="Read-Only")
        hbox.add(button_ro)
        button_rw = gtk.Button(label="Read-Write")
        hbox.add(button_rw)
        button_quit = gtk.Button(label="Quit",stock=gtk.STOCK_QUIT)
        button_quit.show()
        hbox.add(button_quit)

win = WB_Window()
win.connect("delete-event",gtk.main_quit)
win.show_all()
gtk.main()

The resulting layout will be:

I had to use a Gtk.VBox because Gtk.Box orientation was not changing (Fedora23). I've also added the CSS linkedclass to make the buttons "connected".

