Ошибка pygtk при использовании генератора для потоковой передачи и обратного вызова для добавления элементов в древовидную структуру из-за родителя древовидного - PullRequest
0 голосов
/ 03 декабря 2010

Используя класс Generator из http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html,, следующий код приводит к сбою моей программы:

import gtk
import gobject
from GeneratorTask import GeneratorTask

GeneratorTask(self.get_playlist, self.load_playlist).start(playlist_id, model, iter, child)

def get_playlist(self, playlistId=None, treeModel=None, treeIter=None):
    if playlistId is None:
        yield (ten.getRootPlaylist(depth=1), treeModel, treeIter)
    else:
        yield (ten.getPlaylist(playlistId, depth=1), treeModel, treeIter)

def load_playlist(self, playlist, treeModel=None, treeIter=None):
    if treeModel == None:
        treeModel = self.programme

    # Setting treeIter = None prevents assertion fail but 
    # obviously doesn't append the items under the parent
    if len(playlist.find('childPlaylists')):
        for childPlaylist in playlist.find('childPlaylists').findall('playlist'):
            series_iter = treeModel.append(treeIter, [formatTitle(childPlaylist.find('title').text), childPlaylist.find('id').text, True, childPlaylist])
            treeModel.append(series_iter, ['Loading...', None, None, None]) 
    elif len(playlist.find('mediaList')):
        for media in playlist.find('mediaList').findall('media'):
            treeModel.append(treeIter, [media.find('title').text, media.find('id').text, False, media])

Кажется, что проблема с передачей родительского элемента ("treeIter" в коде) теряет правильную ссылкуи больше не действителен к тому времени, когда вызывается обратный вызов.

Как я могу сделать это правильно, чтобы гарантировать добавление новых узлов под правильным родителем, сохраняя при этом некоторый вид обработки событий (как ten.getPlaylist функции будут блокироваться, необходима некоторая многопоточность)?

1 Ответ

1 голос
/ 03 декабря 2010

Только что вспомнил, что когда я просматривал учебник lablgtk, был намек на то, что Gtk.tree_iters недолговечны, и было предложение использовать вместо него Gtk.row_referencesИзвините, это не Python, но вы можете найти это полезным: lablgtk: treeview: ссылка на строки

...