Я сделал простой музыкальный проигрыватель 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)>
Так что приведенный выше код, я думаю, должен работать как шарм ... но это не так.
Большое спасибо за предоставленную помощь!