4

Rhythmbox用のPythonプラグインを開発しています-これには、GtkIconViewである子を持つGtkScrolledWindowが含まれています。IconViewは、Gtk.TreeModelから供給されます。

次のようになります。

ここに画像の説明を入力してください

現在-そしてやや非効率的ですが、すべてのアイコンはツリーモデルのすべての行に描画されます-各アイコンはファイルからのGdkPixbufです。数千の行がある場合、アイコンビュー全体がすべての画像アイコンで完全に更新されるまでにかなりの時間がかかることがあります。

私が達成しようとしているのは、現在の描画領域にあるアイコンのみを更新することです。ユーザーがスクロールしてスクロールバーを離す(またはキーボードを介してナビゲートする)と、新しい描画領域のアイコンが関連する画像で更新されます。

注意-この時点でツリーモデルは完全に入力されています-アイコンのみがロードされていません。

これは実際には私の専門分野ではありません。上記を達成するために使用する必要のある最善のアプローチの指針を探しています。

具体的には、どのGtk + 3描画領域信号(または複数の信号)を公開して(Gtk.ScrolledWindow / Gtk.IconView?)、どのアイコンを更新する必要があるかを計算するPythonコードを記述できますか?

4

2 に答える 2

4

アプリケーションのプロファイルを作成して、何に時間がかかるかを確認する必要があります。

それは画像を読み込んでいますか?そうである場合は、デフォルトの画像を読み込んでビューのどこにでも追加すると、画像を1つだけ読み込むので、十分に速くなります。次に、ビューポートに表示される画像に基づいて、idle_addを使用してオンデマンドで画像をロードおよび更新します。

モデルに画像を追加するのに時間がかかる場合は、idle_addコールバックのビューポートに表示されているものを確認して、オンデマンドで追加する必要があります。

両方が遅い場合は、両方のソリューションを組み合わせる必要があります。オンデマンドでの読み込みと追加です。

バックグラウンドでロードされ、ロードポリシーを含む偽のカバーオブジェクトを作成するのに役立つプロキシデザインパターンについても考えてください。

シグナルの場合、GtkIconViewウィジェットはGtkScrollableを実装します。これは、スクロールを実装する方法を説明しています。垂直方向の調整を設定し、値が変化した信号に接続して、垂直方向の調整がいつ変化したかを確認します。これは、ユーザーが上または下にスクロールしたことを意味し、 timeout_addを使用してタイマーを起動する必要があります。短いタイムアウト(0.5〜1秒の間だと思いますが、テストが必要です)の後、調整が変更されていない場合、これはユーザーがスクロールを停止したことを意味し、表示内容を更新できます。そうしないと、スクロールに更新され、すべてが遅くなります。次に、カバーを更新するために、ビューポートに表示されるアイテムを見つける方法を理解する必要があります。

私はこれまでこれを行ったことがありませんが、GTKを少し知っていて、それがどのように行われるかを理解しようとしただけなので、少し注意して読んでください。とにかく、反応性への答えは「オンデマンド」です。

于 2012-11-09T10:24:37.677 に答える
0

ただし、その一方で、完全に下にスクロールする必要がある場合は、すべてのページが作成されるのを待つ必要があります。idle_addしたがって、イベントループの機能を検討する必要があると思います。

このようにして、画面がロックされたり、ユーザーがページの表示ページをロードするのをPCが待つ必要がなくなります。Win-Win-あなたとあなたのアプリケーションのために。;-)

于 2012-11-09T00:02:41.020 に答える