2011-01-01 70 views
9

Tôi có một ứng dụng PySide trong đó có một biểu tượng cho MainWindow (một trường hợp QMainWindow). Khi tôi chạy tập tin bình thường, biểu tượng có thể nhìn thấy và mọi thứ đều ổn nhưng khi tôi tạo một exe với py2exe, biểu tượng không xuất hiện. Điều này xảy ra với cx_freeze cũng (vì vậy tôi không nghĩ rằng vấn đề là với py2exe).PyQt/PySide - biểu tượng hiển thị

Ứng dụng được thiết kế sử dụng QtDesigner và chuyển đổi sang Python với pyside-uic. Tôi đã thử cả hai bằng cách sử dụng các biểu tượng như một tập tin và như là một nguồn lực (tập tin qrc) và cả hai dường như không làm việc.

Bất kỳ trợ giúp hoặc con trỏ nào sẽ được đánh giá cao.

Cảm ơn.

Trả lời

4

giải pháp kochelmonster của hoạt động rất lâu khi bạn không thử và gộp các dll Qt vào thư viện.zip hoặc exe. Bạn cũng không cần phải đặt đường dẫn thư viện nếu bạn đặt các plugin vào phần cơ sở của thư mục ứng dụng.

tôi vẫn muốn một gói mọi thứ khác vì vậy tôi loại trừ dlls qt và thêm chúng bằng tay. Setup.py của tôi trông giống như sau:

from os.path import join 

_PYSIDEDIR = r'C:\Python27\Lib\site-packages\PySide' 
data_files =[('imageformats',[join(_PYSIDEDIR,'plugins\imageformats\qico4.dll')]), 
       ('.',[join(_PYSIDEDIR,'shiboken-python2.7.dll'), 
       join(_PYSIDEDIR,'QtCore4.dll'), 
       join(_PYSIDEDIR,'QtGui4.dll')]) 
       ] 
setup(
    data_files=data_files, 
    options={ 
     "py2exe":{ 
      "dll_excludes":['shiboken-python2.7.dll','QtCore4.dll','QtGui4.dll'], 
      "bundle_files": 2 
      ... 
     } 
    } 
    ... 
) 

Nếu dự án của bạn sử dụng các dll Qt bổ sung, bạn sẽ phải loại trừ và thêm thủ công chúng. Nếu bạn cần phải tải một cái gì đó khác hơn là một hình ảnh .ico bạn cũng sẽ cần phải thêm các plugin chính xác.

+0

Xin chào, cảm ơn bạn đã trả lời. Điều này làm việc nhưng tôi đã phải thay đổi đường dẫn hình ảnh hoặc biểu tượng đường dẫn tuyệt đối của nó với '\\' es thay vì /. Điều này làm việc cho pyinstaller mặc dù không có tập tin thiết lập là cần thiết cho nó. – user547057

+0

Tôi thích đặt biểu tượng vào các tệp tài nguyên .qrc và biên dịch chúng thành mã python để tránh các sự cố đường dẫn như vậy. Bạn cũng không phải lo lắng về việc đảm bảo các biểu tượng và hình ảnh được bao gồm trong các tập lệnh xây dựng của bạn. Vì vậy, bạn có thể muốn thử sử dụng lại chúng. – Gerald

+0

@Gerald - Có lý do cụ thể nào mà bạn đưa vào shiboken trong câu trả lời này không? Theo như tôi có thể nói nó hoạt động ra ổn mà không có điều đó. – ArtOfWarfare

2

Tôi giả sử nó hoạt động với bmp chứ không phải png/jpg? Nếu có, có khả năng plugin định dạng hình ảnh không tải đúng cách.

tôi đoán thiết lập một tập tin qt.conf trong thư mục cài đặt ứng dụng và làm cho đi chắc chắn plugin dll để/plugins/imageformats/sẽ làm cho mọi việc tốt hơn.

+1

Vâng, đó thực sự là tệp .ico. Tôi không thể nhận được các biểu tượng làm việc và quyết định chuyển ứng dụng sang wxpython, nơi có công cụ chuyển đổi hình ảnh sang tệp python. Với nó, tôi không có vấn đề gì trong lần thực thi cuối cùng. Vì tôi đã sử dụng wxformbuilder để xây dựng giao diện người dùng nên cũng không mất quá nhiều thời gian để chuyển đổi ứng dụng. Cảm ơn. – user547057

+0

@ user547057: Ah. Đây là một câu hỏi py2exe/cz_freeze hơn là câu hỏi Qt. – Macke

2

Tôi đã gặp vấn đề tương tự. Sau khi điều tra, tôi tìm thấy một giải pháp: (Macke có ý tưởng đúng)

cx_freeze không sao chép thư mục plugin PyQt, chứa trình đọc ảnh ico. Sau đây là các bước sau:

  1. trong setup.py copy thư mục PyQt4 plugin để phân phối
  2. của bạn Trong code của bạn viết một cái gì đó như:
application_path = os.path.split(os.path.abspath(sys.argv[0]))[0] 
try: 
    if sys.frozen: 
     plugin_path = os.path.join(application_path, "qtplugins") 
     app.addLibraryPath(plugin_path) 
except AttributeError: 
    pass 
+1

Tốt hơn, chỉ cần sao chép thư mục 'imageformats' vào vị trí nhị phân của bạn. –

0

Bạn phải bao gồm "qico4.dll" theo cách thủ công trong thư mục phát hành của mình. Chèn mã này vào trong setup.py của bạn:

import sys 
from os.path import join, dirname 
from cx_Freeze import setup, Executable 

_ICO_DLL = join(dirname(sys.executable), 
        'Lib', 'site-packages', 
        'PySide', 'plugins', 
        'imageformats', 'qico4.dll') 

build_exe = { 
     'include_files': [(
       _ICO_DLL, 
       join('imageformats', 'qico4.dll'))]} 

setup(name = "xxxxx", 
     version = "1.0.0", 
     ... 
     options = { ... 
       'build_exe': build_exe 
        ...}, 
     ...) 
Các vấn đề liên quan