web-dev-qa-db-ja.com

MacOSでtkinterアイコンを設定する

MacOS用のtkアプリケーションに表示されるアイコンを変更しようとしています。このコードを最後にチェックしたときは、Windowsで機能しました。目標は、このソリューションがすべてのプラットフォームで機能することです。

root = tk.Tk()
app = Application(master=root)

app.master.iconbitmap("my_icon.ico")

app.mainloop()

コードは、私が意図したものではない.pdfファイルのデフォルトアイコンを追加しています。 my_icon.icoへのパスは正しいです。なぜこれがMacOSで機能しないのですか?クロスプラットフォームで機能する究極のソリューションはありますか?

8
Jake

_tk tcl_のドキュメントによると、_wm iconphoto_を試してみることをお勧めします。 OSXをサポートしているようで、MACでスムーズにレンダリングするためにファイルを512x512前後に設定することにも言及しています。

私はMACを持っていないので、これをテストすることはできませんが、これを試してみて、役に立ったかどうか教えてください。

更新:

@ l'L'lが指摘したように、root.iconphoto(True, img)を試してみることをお勧めします。 Macがないため、自分でテストすることはできません。

_import tkinter as tk

root = tk.Tk()
img = tk.Image("photo", file="icon.gif")
# root.iconphoto(True, img) # you may also want to try this.
root.tk.call('wm','iconphoto', root._w, img)

root.mainloop()
_

これが ここのドキュメント からの関連テキストです:

wm iconphotoウィンドウ?-デフォルト? image1?image2 ...?名前付きの写真画像に基づいてウィンドウのタイトルバーアイコンを設定します。 -defaultが指定されている場合、これは将来作成されるすべてのトップレベルにも適用されます。画像内のデータは、呼び出し時にスナップショットとして取得されます。画像が後で変更された場合、これはタイトルバーアイコンに反映されません。さまざまな画像サイズ(16x16や32x32など)を提供できるように、複数の画像を使用できます。ウィンドウマネージャは、提供されたアイコンを適切なサイズに拡大縮小できます。 Windowsでは、画像はWindowsアイコン構造にパックされます。これにより、wm iconbitmapに指定されたicoが上書きされ、その逆も同様です。

Xでは、画像は_NET_WM_ICON Xプロパティに配置されます。これは、最新のウィンドウマネージャーのほとんどがサポートしています。 wmアイコンビットマップが同時に存在する場合があります。大きい方のアイコンを最初に配置して、2つ以下のアイコンを使用することをお勧めします。

Macintoshでは、呼び出された最初の画像はOSXネイティブのアイコン形式で読み込まれ、ダイアログ、Dock、およびその他のコンテキストでアプリケーションアイコンになります。スクリプトレベルでは、macOSでの複数のサイズ/解像度のサポートはTkの範囲外であるため、コマンドはパラメーターで渡された最初の画像のみを受け入れます。開発者は、Macでスムーズにレンダリングできるように、サポートできる最大のアイコン(できれば512ピクセル)を使用する必要があります。

私はこれをWindowsでテストして、少なくともそこで機能することを確認しました。青い正方形の画像を使用してテストしました。

上記のドキュメントが正確であれば、MACでも機能するはずです。

enter image description here

4
Mike - SMT

重要な注意:この方法は長く、手元のタスクには多くの作業が必要です。ただし、いくつかの無関係な利点があります。より良い方法があるかもしれませんが、これは機能することに注意してください。
とにかく、先に進みます..。

Py2appを使用できます。

Py2appはプログラムを.appに変換します。つまり、アプリケーションとして実行されます(そうであるため)。 tkinterを使用する場合、GUIは通常、使いやすさのためにアプリに変換されるため、これは通常、最終的に必要なものです。 py2appのドキュメント ここ を読むか、非公式だが理解しやすい(私の意見では)チュートリアル ここ を読むことができます。また、プロセスの実行方法についても要約します。

最初のインストールpy2app:コマンドプロンプトにこれを入力します:

Sudo pip install -U py2app

成功した場合は、py2appを取得する必要があります。そうでない場合、1つの問題はpipがないことである可能性があります。別のコマンドでダウンロードできます。

Sudo easy_install pip

ステップ1:プログラムと同じ辞書にsetup.pyというファイルを作成します。

ステップ2:これをファイルに入れます。

from setuptools import setup

#APP would be the name of the file your code is in.
APP = ['example.py']
DATA_FILES = []
#The Magic is in OPTIONS.
OPTIONS = {
    'argv_emulation': False,
    'iconfile': 'app.icns', #change app.icns to the image file name!!!
    }

setup(
    app=APP,
    name='Your app’s name', #change to anything
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

ステップ3:次に、ファイルが含まれている辞書でbashターミナルを開き、次のコマンドを入力します。

python setup.py py2app -A

-Aを使用すると、アプリはコードの更新に応答しますが、アプリは共有できなくなります。開発が完了したら、次のように、今度は-Aなしでコマンドを再実行します。

python setup.py py2app

注:python 3 py2appの場合、python3 setup.py py2...の代わりにコマンドpython setup.py py2...を使用する必要がある場合があります。

ステップ4:the dictionary your code is in/distに移動します。そのフォルダにあなたのアプリがあります。 (コマンドを実行したときに、ステップ3でdistフォルダーが作成されているはずです)

Windowsユーザーの場合:py2appは使用すべきものではなく、代わりに py2exe を使用してください。

1
Eb946207

Mac OSを使用している場合は、.icoイメージの代わりに.icnsイメージを使用する必要があります。

使用できます:

from tkinter import Tk
from platform import system

platformD = system()
if platformD == 'Darwin':

    logo_image = 'images/logo.icns'

Elif platformD == 'Windows':

    logo_image = 'images/logo.ico'

else:

    logo_image = 'images/logo.xbm'

root = Tk()
root.title("My App")
root.iconbitmap(logo_image)
root.resizable(0, 0)
root.mainloop()