Search code examples
python-2.7gtk3gnome

Reduce size of edit box in CellRendererText in Gtk+ Python


I am trying to reduce the size of edit box that appears while editing a cell of treeview in Gtk+ Python.

Here is my code :

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class CellRendererTextWindow(Gtk.Window):

   def __init__(self):
        Gtk.Window.__init__(self, title="CellRendererText Example")

        self.set_default_size(200, 200)

        self.liststore = Gtk.ListStore(str, str)
        self.liststore.append(["Fedora", "http://fedoraproject.org/"])
        self.liststore.append(["Slackware", "http://www.slackware.com/"])
        self.liststore.append(["Sidux", "http://sidux.com/"])

        treeview = Gtk.TreeView(model=self.liststore)

        select_render = Gtk.CellRendererToggle()
        select_render.set_property('activatable', True)
        select_render.set_property("radio", True)
        select_render.connect('toggled', self.on_toggle)
        select_column = Gtk.TreeViewColumn(" %s" %('Select'), select_render,    
        active=0)
        select_column.set_clickable(True)
        treeview.append_column(select_column)

        renderer_text = Gtk.CellRendererText()
        renderer_text.set_property("editable", True)
        column_text = Gtk.TreeViewColumn("Text", renderer_text, text=0)
        treeview.append_column(column_text)

        renderer_editabletext = Gtk.CellRendererText()
        renderer_editabletext.set_property("editable", True)

        column_editabletext = Gtk.TreeViewColumn("Editable Text",
        renderer_editabletext, text=1)
        treeview.append_column(column_editabletext)

        renderer_editabletext.connect("edited", self.text_edited)

        self.add(treeview)

    def text_edited(self, widget, path, text):
        self.liststore[path][1] = text

    def on_toggle(self, cell, path):
        print "Toggled"

win = CellRendererTextWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

Here is the output of this code:

output

When I try to edit cell it appears like this :

edit cell

What I want is that, I want to reduce the size of that edit box which appears while editing cell because it is overlapping other cells of row I want that edit box to appear within its column width, Notice I don't want to affect column or cell size in this order.

I tried to set various properties like: width, width-chars, max-width-chars etc.

max-width-chars shows some impact but then it reduces the size of column as well.

Previously it was happening in gtk2, but in Gtk3+ it is showing such kind of impact.

Do anybody have any solution to this? I am really stuck with it.


Solution

  • The edit box of gtk cell renderer text has some fixed width.

    So when you distribute the each columns with some space the overlap of edit box won't happen.

    Here in your code I have simple increase the width of the windows size, in that way the cellrendererText gets enough space to open the edit box without overlapping with other box

    import gi
    gi.require_version('Gtk', '3.0')
    from gi.repository import Gtk
    
    class CellRendererTextWindow(Gtk.Window):
    
        def __init__(self):
            Gtk.Window.__init__(self, title="CellRendererText Example")
    
            self.set_default_size(400, 200)
    
            self.liststore = Gtk.ListStore(str, str)
            self.liststore.append(["Fedora", "http://fedoraproject.org/"])
            self.liststore.append(["Slackware", "http://www.slackware.com/"])
            self.liststore.append(["Sidux", "http://sidux.com/"])
    
            treeview = Gtk.TreeView(model=self.liststore)
            treeview.set_grid_lines(Gtk.TreeViewGridLines.BOTH)
    
            select_render = Gtk.CellRendererToggle()
            select_render.set_property('activatable', True)
            select_render.set_property("radio", True)
            select_render.connect('toggled', self.on_toggle)
            select_column = Gtk.TreeViewColumn(" %s" %('Select'), select_render, active=0)
            select_column.set_clickable(True)
            treeview.append_column(select_column)
    
            renderer_text = Gtk.CellRendererText()
            renderer_text.set_property("editable", True)
            column_text = Gtk.TreeViewColumn("Text", renderer_text, text=0)
            column_text.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
            column_text.set_expand(True)
            treeview.append_column(column_text)
    
            renderer_editabletext = Gtk.CellRendererText()
            renderer_editabletext.set_property("editable", True)
    
            column_editabletext = Gtk.TreeViewColumn("Editable Text", renderer_editabletext, text=1)
            treeview.append_column(column_editabletext)
    
            renderer_editabletext.connect("edited", self.text_edited)
    
            self.add(treeview)
    
        def text_edited(self, widget, path, text):
            self.liststore[path][1] = text
    
        def on_toggle(self, cell, path):
            print "Toggled"
    
    win = CellRendererTextWindow()
    win.connect("destroy", Gtk.main_quit)
    win.show_all()
    Gtk.main()
    

    Here is the output