Frage

Ich habe eine Nautilus-Erweiterung geschrieben, die die Metadaten des Bildes liest (generiert exiftool), aber wenn ich Ordner mit vielen Dateien öffne, verlangsamt es sich wirklich den Dateimanager und hängt, bis der Lesen der Daten der Datei abgeschlossen ist.

Gibt es eine Möglichkeit, Nautilus seine Arbeit zu halten, während er meine Erweiterung läuft?Vielleicht könnten die EXIF-Daten in den Säulen allmählich erscheinen, während ich mit meiner Arbeit weitergauste. generasacodicetagpre.

War es hilfreich?

Lösung

das passiert, weil Sie update_file_info aufrufen, der Teil des asynchronen IO-Systems von Nautilus ist. Daher blockiert es Nautilus, wenn die Operationen nicht schnell genug sind.

In Ihrem Fall ist es verschärft, da Sie ein externes Programm anrufen, und das ist ein teurer Betrieb. Beachten Sie, dass update_file_info einmal pro Datei genannt wird. Wenn Sie 100 Dateien haben, rufen Sie das 100-fache des externen Programms an, und Nautilus muss auf jeden warten, bevor Sie den nächsten bearbeiten.

Da sind nautilus-python 0.7 verfügbar update_file_info_full und cancel_update , mit denen Sie Async-Anrufe programmieren können. Sie können den Dokumentation von Nautilus 0.7 für Weitere Details . Es lohnt sich, dies zu erwähnen, dass dies nur eine Begrenzung von Nautilus-Python war, was zuvor die in c verfügbaren Methoden nicht freigesetzt hat.

edit : ein paar Beispiele hinzugefügt.

Der Trick macht den Prozess so schnell wie möglich oder macht es asynchron.

Beispiel 1: Aufrufen eines externen Programms

Verwenden einer vereinfachten Version Ihres Codes, wir machen asynchron mit gobject.timeout_add_seconds in update_file_info_full . generasacodicetagpre.

Der obige Code wird NAUTILUS nicht blockiert, und wenn in der Spaltenansicht die Spalte 'Datum Original' verfügbar ist, zeigen die JPEG- und PNG-Bilder den Wert ' unbekannt ', und langsam werden sie aktualisiert (der Unterprozess wird nach 1 Sekunde aufgerufen).

Beispiele 2: Verwenden einer Bibliothek

Anstatt ein externes Programm aufzurufen, kann es besser sein, eine Bibliothek zu verwenden. Wie das Beispiel unten: generasacodicetagpre.

Wenn die Routine langsam ist, müssen Sie es asynchron machen (vielleicht etwas besseres als gobject.timeout_add_seconds .

Endlich, aber nicht zuletzt, in meinen Beispielen habe ich gobject introspection (typischerweise für Nautilus 3) verwendet, aber es ist einfach, ihn zu ändern, um das Modul nautilus direkt zu verwenden.

Andere Tipps

Die obige Lösung ist nur teilweise korrekt.

Zwischen Statusänderungen für file_info metadata, sollte der Benutzer file_info.invalidate_exTension_info () anrufen, um Nautilus der Änderung zu benachrichtigen. Dies kann nicht mit " unbekannten " in Ihren Spalten enden. generasacodicetagpre.

volles Arbeitsbeispiel hier:

Vollständiges Beispiel

API-Dokumentation

Dank Dave!

Ich suchte nach einer Lösung für den Text " unbekannter " in der Spalte für Ewigkeiten generasacodicetagpre.

das Thema für mich richtig behoben :)

pro der API-API-Dokumentation

https://projects-old.gnome.org/nautilus-python/documentation/html/class-nautraphus-python-file-info.html#method-nautilus-Python-Datei-Info - Invalidate-Extension-Info

nautilus.fileinfo.invalidate_extesion_info generasacodicetagpre.

Ungerechte die Informationen NAUTILUS hat über diese Datei, wodurch neue Informationen von seinen Nautilus.infoProvider-Anbietern anfordert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top