Получить выбранный объект из ListBox (привязан к ListStore) в Python GTK - PullRequest
0 голосов
/ 07 января 2019

Я сделал простой музыкальный проигрыватель GTK с ListBox (в качестве списка воспроизведения).

Это класс GObject, который я использую для привязки к ListBox (используя метод bind_model ()) и ListStore.

import eyed3
from gi.repository import Gio, GObject

class Song(GObject.GObject):

    path = GObject.Property(type=str)
    name = GObject.Property(type=str)

    def __init__(self, path):
        GObject.GObject.__init__(self)
        self.path = path
        self.file = eyed3.load(path)
        self.name = self

    def __str__(self):
        return str(self.file.tag.artist) + ' - ' + str(self.file.tag.title)


playlist = Gio.ListStore().new(Song)

И вот как я привязываю ListStore к ListBox:

play_listbox.connect('row-selected', self.on_row_selected)

playlist.append(Song('/home/user/Downloads/Some album/01 - Song1.mp3'))
playlist.append(Song('/home/user/Downloads/Some album/02 - Song2.mp3'))

play_listbox.bind_model(playlist, self.create_song_label)

def create_song_label(self, song):
    return Gtk.Label(label=song.name)

И пока все работает так, как должно.

Вопрос заключается в следующем: возможно ли получить объект песни (сохраненный в списке воспроизведения) на основе выбора? Чтобы получить свойство пути, хранящееся в этом объекте?

Если нет, возможно ли хотя бы получить выделенный текст? Попытка это с

def on_row_selected(self, container, row):
    print(row.widget.label)

Дает трассировку:

Traceback (most recent call last):
  File "/home/user/Documents/App/player.py", line 45, in on_row_selected
    print(row.widget.label) # or data, value, text - nothing works
RuntimeError: unable to get the value

переменная строки имеет тип

<Gtk.ListBoxRow object at 0x7f9fe7604a68 (GtkListBoxRow at 0x5581a51ef7d0)>

Так что приведенный выше код, я думаю, должен работать как шарм ... но это не так.

Большое спасибо за предоставленную помощь!

1 Ответ

0 голосов
/ 09 января 2019

Так что вам нужно назначить выбор с помощью:

treeview_selection = treeview.get_selection()    

И соедините его с «измененным» сигналом:

treeview_selection.connect('changed', on_tree_selection_changed)

Затем вы можете получить необходимые данные с помощью:

def on_tree_selection_changed(self, treeview):
    model, treeiter = treeview.get_selected()
    if treeiter is not None:
        print(model[treeiter][0]) # you should a list index to get the data you require for each row - first column = [0], second column = [1] etc.

Я бы посоветовал вам прочитать pgi документы , а также python Gtk docs

...