PyQt4でアプリケーションのタスクバーアイコンを設定するにはどうすればよいですか?
私はsetWindowIconを試しましたが、メインウィンドウの左上にアイコンを正常に設定しましたが、Windows 7のタスクバーに表示されるアイコンには影響しません-タスクバーアイコンはデフォルトのままですPython pywアイコン。これが私のコードです:
_from PyQt4 import QtGui
app = QtGui.QApplication([])
mainwindow = QtGui.QMainWindow()
mainwindow.show()
app.setWindowIcon(QtGui.QIcon('chalk.ico'))
mainwindow.setWindowIcon(QtGui.QIcon('chalk.ico'))
app.exec_()
_
[更新] setWindowIcon()
の前にshow()
を配置してみました。私は他の画像、icoとpngでそれを試しました。何も役に立ちません。
少し掘り下げた後、私は答えを見つけました。
Windows 7では、タスクバーは「アプリケーションウィンドウ」自体ではなく、「アプリケーションユーザーモデル」用です。たとえば、アプリケーションの複数の異なるインスタンスを実行していて、各インスタンスに独自のアイコンがある場合、それらはすべて1つのタスクバーアイコンの下にグループ化されます。 Windowsはさまざまなヒューリスティックを使用して、異なるインスタンスをグループ化する必要があるかどうかを決定します。この場合、Pythonw.exeによってホストされているすべてのものをPythonw.exeのアイコンの下にグループ化する必要があると決定しました。
正しい解決策は、Pythonw.exeが他のアプリケーションをホストしているだけであることをWindowsに伝えることです。おそらく、Pythonの将来のリリースでこれが可能になります。あるいは、レジストリキーを追加して、Pythonw.exeがアプリケーションではなく単なるホストであることをWindowsに通知できます。MSDNのドキュメントを参照してください。 AppUserModelIDs の場合。
または、PythonからのWindows呼び出しを使用して、このプロセスに適切なAppUserModelIDが何であるかを明示的にWindowsに伝えることができます。
import ctypes
myappid = 'mycompany.myproduct.subproduct.version' # arbitrary string
ctypes.windll.Shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
編集:Ronanの答えを見てください:myappid文字列はユニコードでなければなりません。
@DamonJWの答えは機能しますが、マイナーな問題があります。myappidはUnicodeである必要があります(引数のタイプはPCWSTRです)。
import ctypes
myappid = u'mycompany.myproduct.subproduct.version' # arbitrary string
ctypes.windll.Shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
そうしないと、AppUserModelIDを取得すると、間違ったUnicode文字(祭潣灭湡祭牰摯捵畳灢潲畤瑣瘮牥楳湯
):
import ctypes
from ctypes import wintypes
lpBuffer = wintypes.LPWSTR()
AppUserModelID = ctypes.windll.Shell32.GetCurrentProcessExplicitAppUserModelID
AppUserModelID(ctypes.cast(ctypes.byref(lpBuffer), wintypes.LPWSTR))
appid = lpBuffer.value
ctypes.windll.kernel32.LocalFree(lpBuffer)
if appid is not None:
print(appid)
とは言っても、WindowsはUnicode文字列を「別のプロセス」として認識し、それに応じてアイコンを切り替えるため、これは些細なことです。
アプリがGUIを表示する前に、AppUserModelIDを設定する必要があります。他のWindows 7機能にアクセスする必要がある場合は、PyQtバインディングを備えたWindows 7用のQtアドオンである Q7Goodies を参照してください。