http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.htmlのGeneratorクラスを使用すると、次のコードでプログラムが失敗します。
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
関数がブロックするため、いくつかのスレッドが必要です)。