warownia1
warownia1

Reputation: 2945

GtkListBox, how to prevent auto-selecting a row on window show

I have a list box with several rows attached to a window.

list_box = Gtk.ListBox()
list_box.insert(Gtk.Label('foo'), -1)
list_box.insert(Gtk.Label('bar'), -1)
list_box.insert(Gtk.Label('qux'), -1) # ListBoxRow is added automatically

window = Gtk.Window()
window.add(list_box)
window.show_all()

When I call show_all(), the first row of the list is being selected automatically what I don't want to happen. How to prevent auto-selecting it?
I tried changing the order of the functions call

window.show_all()
window.add(list_box)

which broke the layout and the size of the window doesn't fit to the list.

Upvotes: 1

Views: 2007

Answers (3)

Noa Kirsh
Noa Kirsh

Reputation: 1

Add a dummy label to the top of your list_box and hide it:

dummyLabel = Gtk.Label('nothing') # workaround for focus of title entry
list_box.insert(dummyLabel, -1)
list_box.insert(Gtk.Label('foo'), -1)
list_box.insert(Gtk.Label('bar'), -1)
list_box.insert(Gtk.Label('qux'), -1)  # ListBoxRow is added automatically
window = Gtk.Window()
window.add(list_box)
window.show_all()
dummyLabel.hide()
Gtk.main()

The result: result

Upvotes: 0

GammaGames
GammaGames

Reputation: 1828

I was running into this issue as well, I used the following code to do it:

listbox = Gtk.ListBox(margin=0)
listbox.set_selection_mode(Gtk.SelectionMode.NONE)

I can still click on each row and do a callback with the following, as well:

listbox.connect("row-activated", self.callback)

Upvotes: 1

jcoppens
jcoppens

Reputation: 5440

The ListBox has a property selection-mode, which you can set to Gtk.SELECTION_NONE. In this case none of the rows will be selected (and cannot be selected later). I don't know if that is what you want.

You can also call the method unselect_all, which will unselect all rows. For this to work, the ListBox must be in SELECT_MULTIPLE or SELECT_SINGLE mode.

This example seems to work completely as expected (i.e. no selection at the start, and if a line is selected, the button can unselect it). If in your installation it doesn't work, I would try to update your packages:

from gi.repository import Gtk

class MainWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.connect("delete-event", self.on_delete)

        self.listbox = Gtk.ListBox()
        self.listbox.insert(Gtk.Label('foo'), -1)
        self.listbox.insert(Gtk.Label('bar'), -1)
        self.listbox.insert(Gtk.Label('qux'), -1) # ListBoxRow is added automatically

        button = Gtk.Button("Clear selection")
        button.connect("clicked", self.on_button_clicked)

        vbox = Gtk.VBox()
        vbox.pack_start(button, False, True, 0)
        vbox.pack_start(self.listbox, False, True, 0)

        self.add(vbox)
        self.show_all()

        Gtk.main()

    def on_button_clicked(self, btn):
        self.listbox.unselect_all()

    def on_delete(self, win, event):
        Gtk.main_quit()


def main():
    w = MainWindow()

    return 0

if __name__ == '__main__':
    main()

A note about gtk3 themes: Some themes do not show selected rows at all. Particularly dark themes such as eg. FlatStudioDark, but also some light themes.

Upvotes: 0

Related Questions