2009-05-20 6 views
10

Próbuję użyć obrazu JPEG w obiekcie QImage ze skryptu Python z PyQt4.Włączanie obsługi plików JPEG dla QImage w skompilowanych skryptach Python py2exe?

Sam skrypt działa doskonale, obraz jest ładowany i można nim manipulować i renderować. Jednak gdy próbuję "skompilować" ten skrypt za pomocą py2exe, wszystko działa tylko z obrazem JPEG. Zastąpienie go równoważnikiem PNG działa, ale ponieważ mój program pobiera obrazy z Internetu, nie zawsze będą one w formacie PNG i nie będę mógł pozwolić sobie na ich konwersję z inną biblioteką.

Odkryłem, że obsługa obrazów JPEG dla QImage, wraz z innymi formatami graficznymi, jest zapewniana przez niektóre biblioteki DLL w katalogu \ qt \ plugins \ imageformats (nazywane są one qjpeg4.dll i qjpeg4d.dll). Myślę, że muszę użyć ich w jakiś sposób w moim pliku wykonywalnym, ale nie wiem jak. Próbowałem po prostu skopiować je do mojego katalogu exe, bez powodzenia. Próbowałem, jako indicated here, zawrzeć te pliki jako pliki data_files w skrypcie setup.py, ale bez powodzenia (wygląda na to, że wszystko, co robi, to kopiowanie tych plików do katalogu exe, tak więc nic nie zmienia ani kopiowania ręcznie) .

Jestem pewien, że istnieje garstka aplikacji wykorzystujących PyQt z obrazami JPEG, jak to robią? Wydawało mi się to banalnym zadaniem, ale utknąłem na nim teraz.

Chciałbym również, aby moja aplikacja była wieloplatformowa (dlaczego indziej miałabym kodować w Pythonie?), Mam nadzieję, że nie napotkam na takie problemy z pakowaniem (nie jest to jedyna) podczas pakowania dla OS X lub Linux. Czy ja?

Odpowiedz

12

Po godzinach potykając się wokół tej samej kwestii, chciałbym podzielić się rozwiązanie, które pracowały dla mnie na Windows Vista: użyciu python2.6

Skopiuj poniższy katalog do katalogu dist generowane przez py2exe :

C:\Python26\Lib\site-packages\PyQt4\plugins\imageformats 

właśnie spadł katalog imageformats bezpośrednio do mojego katalogu dist, bez dalszych modyfikacji qt.conf lub coś podobnego. Nie próbowałem tego, ale może to również działać dla phonona.

+0

Niektórzy komentowali, że odpowiedź brzmiała: Użyłem tego rozwiązania. Jego doskonała praca na win7 32/64, XP sp3 professional (32bit). ALE, jego nie na XP SP2 (32bit), i porównać XP SP3 i XP SP2 przez "Process Explorer", XP SP2 brakuje .. \ imageformats \ *. Dll nie mam pojęcia do rozwiązany ... czy ktoś ma rozwiązanie? – Macke

1

Muszę się przyznać, że nigdy nie udało mi się uzyskać odpowiedniej kombinacji py2exe + pyqt (a py2exe wcale nie pomaga w przypadku pakowania wieloplatformowego). PyInstaller wydaje się być o wiele lepszy - dokumenty o numerze http://www.pyinstaller.org/ są stare, ale bagażnik svn jest dużo nowszy. Niektóre dokumenty znajdują się w slajdach przedstawionych na niedawnej konferencji Pycon Italia Tre - http://www.pycon.it/static/stuff/slides/distribuire-programmi-python-con-pyinstaller.pdf - a slajdy są w języku angielskim i zawierają aktualną wiadomość e-mail opiekuna, więc powinny pomóc! (I, niech wszyscy lobbują obecnego opiekuna, aby zaktualizować dokumenty ...! -)

+0

Brak szczęścia. Chwyciłem najnowszą migawkę SVN PyInstaller i udało mi się skompilować mój program, ale nie posiadał on obsługi JPEG i nie ma żadnej wtyczki imageformats, mimo że strona SupportedPackages twierdzi, że są w pełni obsługiwane. Jednak metoda PyInstaller wykrywająca repozytorium Qt jest zepsuta i zwraca nieprawidłową ścieżkę, którą naprawiłem, tworząc dowiązanie symboliczne (lub "skrzyżowanie", jak nazywa się je na NTFS). Dałem skryptowi jeszcze jedną próbę, i tym razem wykryłem wtyczki Qt4 i skopiowałem je do katalogu exe, ale po uruchomieniu exe znowu nie obsługuje JPEG! :( –

1

Spróbuj dodać plik qt.conf do katalogu exe, aby powiedzieć qt gdzie znaleźć pliki binarne i wtyczki.

Coś następujących robót dla prostego przypadku, w którym po prostu zrzucić wszystkie DLL w tym samym katalogu co plik EXE:

[Paths] 
Prefix = . 
Plugins = . 

UPDATE: Następnie skopiuj plugins-zawartość (katalogi imageformat/sqldriver etc) do exe reż. Myślę, że nie można załadować biblioteki DLL z tego samego katalogu, co plik exe. Zobacz Qt plugin doc, aby uzyskać szczegółowe informacje na temat podkatalogów wtyczek. (Lub, pomiń "plugins =." I skopiuj katalog wtyczek do katalogu exe, więc masz /plugins/imageloaders/qjpeg4.dll).

+0

Tak, też tego próbowałem, ale wciąż nic :(Tylko obrazy PNG są wczytywane Zastanawiam się, czy powinienem rozważyć konwersję wszystkich obrazów z innym modułem/biblioteką Jakieś sugestie, który z nich powinienem użyć? –

+0

usuwanie linii wtyczek i ręczne kopiowanie katalogu wtyczek qt do katalogu wyjściowego (czyli masz /plugins/imageloaders/qjpeg4.dll). Czy to działa, jeśli używasz qt.conf? pyqt? – Macke

+0

Oh. Diabeł jest powszechnie używane przez wielu do ładowania obrazów. Nie próbowałem tego sam, ponieważ zawsze używam większych bibliotek. – Macke

0

Po wypróbowaniu wszystkich powyższych rozwiązań na próżno, skończyło się na użyciu PIL, aby załadować moje obrazy. Ponieważ chciałem przekonwertować te obrazy do tekstury w widgecie OpenGL Qt, wynik był taki sam, niezależnie od tego, czy załadowałem obraz za pomocą Qt czy PIL. Mimo to jestem zaskoczony, że tak podstawowa rzecz jak ładowanie plików JPEG jest tak skomplikowana w bibliotece GUI, która jest dobrze znana i powszechnie używana jako Qt.

0

Miałem dokładnie ten sam problem. Naprawiono go przy tym: http://mail.python.org/pipermail/python-list/2008-June/669374.html

  1. Kopia Qt wtyczki do katalogu: $ YOUR_DIST_PATH/PyQt4/plugins;
  2. Skopiuj plik qt.conf do katalogu dist;
  3. Edytuj plik qt.conf, zmień Prefiks na./ PyQt4
+0

Próbowałem tego, na próżno :(Myślę, że to ja robię coś źle tutaj, ale cokolwiek, mój program działa .. Na razie –

1

Jestem na systemie Leopard OSX. Załóżmy, że masz aplikację MyApp.app.

  • Put bibliotek libqjpeg.dylib i libqgif.dylib w
    MyApp.app/Contents/plugins/imageformats/
  • umieścić to w qt.conf w MyApp.app/Contents/resources/:

    [Paths] 
    Prefix = . 
    Binaries = . 
    

na moim komputerze (Leopard) to działa.

+0

To zadziałało naprawdę dobrze Dzięki! – EightyEight

0

w oknach, sugerowane rozwiązania działają idealnie.

Jednak na osxie nie może działać nawet zgodnie z instrukcjami powyżej.

pytanie: pliki libqjpeg.dylib i libqgif.dylib znajdują się w katalogu /Developer/Applications/Qt/plugins/imageformats/, a jeśli zainstalowałeś samą Qt, nie tylko PyQt. te pliki nie działają dla mnie.

w dystrybucji pyqt widzę pliki libqjpeg.bundle i libqgif.bundle w /opt/local/libexec/qt4-mac/plugins/imageformats/, jednak nie są to biblioteki, a przy okazji nie mogę otworzyć ich zawartość albo, nawet jeśli mają one rozszerzenie .bundle. używanie tych plików również nie działa.

Jestem ciekawa, co zrobiłeś, aby działało na osx. Zainstalowałem PyQt po this guide.

0

Dla mnie problem został rozwiązany po prostu kopiowanie "qt.conf" dla katalogu pliku wykonywalnego.

Możesz znaleźć "qt.conf" w ... \ PythonXX \ Lib \ site-packages \ PyQt4 \ qt.conf.

Dzięki za pomoc.

+1

Witam, tylko jedna korekta ... Problem został rozwiązany, gdy skopiowałem plik "qt.conf" i folder "imageformats". Można znaleźć folder w "... \ PythonXX \ Lib \ site-packages \ PyQt4 \ plugins" :-) Dzięki. –

0

Wszystko powyżej mnie nie powiodło się, dopóki nie zdałem sobie sprawy, że jestem łączenie .exe (to znaczy, miałem opcję "bundle_files": 2 w moim setup.py.Zmieniłem go na bundle_files = 2, a teraz działa świetnie.

Powyższe rozwiązania są w porządku. W szczególności, właśnie dodałem następujący wiersz w moim setup.py: data = [("imageformats", glob.glob ("C: \ Python26 \ Lib \ site-packages \ PyQt4 \ plugins \ imageformats * .dll")) ]

(oprócz innych plików, oczywiście).

Następnie obraz loading DLL są w MY_EXE_DIR/imageformats

nie potrzebują qt.conf do tej pracy, choć jestem pewien, że można go używać, jeśli chcesz zachować swoje drzewo katalogów mniej zagracone.

0

Możliwe jest użycie wtyczki JPEG ze skryptem py2exe, nawet przy użyciu bundle_files. Trzeba zorganizować dwie rzeczy, aby to działało poprawnie:

  1. Kopiowanie PyQt4/plugins/imageformats do katalogu wyjściowego py2exe (domyślnie: dist)

    Trzeba tylko skopiować formatów rzeczywiście potrzeba.

  2. Kiedy należy wybrać opcję bundle_files trzeba execlude QT dll z zipfile używając opcji --dll-excludes dla pyexe.

    Nadal musisz skopiować biblioteki DLL Qt do katalogu wyjściowego w inny sposób (na przykład , używając opcji data_files).

0

Dzięki za pomocne odpowiedzi na pytanie! Napotkałem ten sam problem co Ty i żadne rozwiązanie nie mogło pomóc. Mam nadzieję, że korzystałem z VCS i stwierdziłem, że stara wersja mojej aplikacji ładowała obrazy JPEG poprawnie i nowe wersje przestały to robić. Złapałem ten błąd za pomocą PySide v1.2.2.

Aby włączyć ładowanie bibliotek, użyłem tego samego rozwiązania, co @Macke (tj. Dodano i edytowałem qt.conf).

Moja qt.conf był obok:

[Paths] 
Binaries = . 
Plugins = qtplugins 

C:\Python27\Lib\site-packages\PySide\plugins directory została skopiowana do qtplugins katalogu, więc miałem kolejne katalogi:

qtplugins\accessible 
qtplugins\codecs 
qtplugins\graphicssystems 
qtplugins\iconengines 
qtplugins\imageformats 

miałem następny kod:

class NotesCalendar(QtGui.QCalendarWidget): 
    note_icon = QtGui.QImage("res/16note.png") 

Zmienna klasy ruchomej NotesCalendar.note_icon do konstruktora rozwiązała problem, a Qt poprawnie ładował biblioteki. Wydaje się, że konstruktor klasy class przerwał niektóre wewnętrzne rzeczy PySide.

Działa bez problemów w systemie Windows.Określanie prawidłowej qt.conf i kopiowanie plugins katalogu wystarczy włączyć obsługę plików JPEG w py2exe + PySide build. Oczywiście, nie możesz mieć problemów we własnym kodzie.

Mam nadzieję, że to uratuje kogoś dzień! ;)

Powiązane problemy