2013-06-12 101 views
9

我有一個PySide GUI應用程序(用Python編寫3,在Windows 7專業版上運行)中,我設置的應用程序圖標如下:應用程序圖標

class MyGui(QtGui.QWidget): 
    def __init__(self): 
     super(MyGui, self).__init__() 
     ... 
     self.setWindowIcon(QtGui.QIcon('MyGui.ico')) 

     if os.name == 'nt': 
      # This is needed to display the app icon on the taskbar on Windows 7 
      import ctypes 
      myappid = 'MyOrganization.MyGui.1.0.0' # arbitrary string 
      ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid) 
     ... 

我得到的東西​​來自this answer。如果我刪除這些行,則執行python MyGui.py時,任務欄中會顯示Python圖標。

隨着這些行包括一切看起來不錯,與窗口和任務欄上的正確圖標。但是,當我使用cxfreeze打包gui時,窗口和任務欄圖標都變爲通用的windows .exe圖標。

我使用cxfreeze.bat打包應用程序,使用發現的指令here,包括--icon開關。在瀏覽器中查看時,使用該開關可使生成的exe文件具有正確的圖標。但是,啓動應用程序時,應用程序窗口和任務欄不顯示圖標。我試圖將.ico文件複製到.exe所在的目錄中,但這沒有幫助。

我在Windows 7上獲得相同的行爲& 8.好奇的是,如果我將應用程序固定到任務欄,任務欄圖標顯示正確,但窗口圖標仍然是普通的exe圖標。

如何讓圖標正確顯示?

回答

7

PySide需要訪問特殊的DLL來讀取.ico文件。我認爲這是qico4.dll。

你可以嘗試改變對setWindowIcon的調用來打開圖標作爲.png,並將它的.png放在./dist目錄中,看看是否有效。如果是這樣,那麼你的代碼是好的,我敢肯定這是.dll的問題。你需要告訴cx_freeze在構建中包含dll。

我認爲PySide爲Windows提供了嵌入式.ico,不需要能夠讀取數據本身,所以這就是爲什麼這是工作。但是,要讀取可執行目錄中的嵌入式圖標資源或ico文件,它將需要該DLL。

+0

這很有效!非常感謝。我確實看到了一些關於qico4.dll要求的信息,但解決這個問題的方法各不相同,而且我嘗試過的這對夫婦沒有工作。把.ico和.png圖標都不是最好的,但它是最簡單的解決方案。 – Praetorian

5

我發現另一種解決方案,不需要PNG和ICO格式的圖標。正如Simon在他的回答中提到的那樣,需要qico4.dll來閱讀.ico文件。此外,該文件需要放在名爲imageformats的目錄中,該目錄是您的應用程序目錄的子目錄。該文件夾結構應該是這樣的:

My Gui 
| 
|-- MyGui.exe 
|-- QtCore4.dll 
|-- QtGui4.dll 
|-- ... 
| 
|-- imageformats 
    | 
    |-- qico4.dll 

qico4.dll安裝與PySide分佈。如果你選擇典型的安裝選項,文件應該在

os.path.join(os.path.dirname(sys.executable), 
      'Lib', 
      'site-packages', 
      'PySide', 
      'plugins', 
      'imageformats') 
+1

不錯的跟進,很高興在一個地方擁有所有這些信息.. –