web-dev-qa-db-fra.com

Définir l’icône tkinter sur Mac OS

J'essaie de changer l'icône qui apparaît sur mon application tk pour Mac OS. La dernière fois que j'ai vérifié ce code fonctionnait pour Windows. L'objectif est que cette solution fonctionne sur toutes les plateformes.

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

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

app.mainloop()

Le code ajoute l'icône par défaut pour un fichier .pdf, ce qui n'est pas ce que je voulais. Le chemin d'accès au my_icon.ico est correct. Pourquoi cela ne fonctionne-t-il pas pour Mac OS? Existe-t-il une solution ultime qui fonctionnera sur plusieurs plates-formes?

7
Jake

Selon la documentation tk tcl, vous voudrez peut-être essayer wm iconphoto. Il semble qu’il puisse prendre en charge OSX et il est également indiqué de définir le fichier à environ 512x512 pour un rendu fluide sous MAC.

Je n'ai pas de MAC, je ne peux donc pas le tester, mais essayez-le et laissez-moi savoir si cela a aidé.

Mettre à jour:

Comme @ l'l'l l'a fait remarquer, vous voudrez peut-être essayer root.iconphoto(True, img). Je suis incapable de le tester moi-même car je n'ai pas de 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()

Voici le texte pertinent de la documentation ici :

wm iconphoto window? -default? image1? image2 ...? Définit la barre de titre icône pour la fenêtre basée sur les images photo nommées. Si -default est spécifiée, elle s’applique également à tous les futurs niveaux créés . Les données dans les images sont prises en instantané au moment de invocation. Si les images sont modifiées ultérieurement, cela ne sera pas répercuté sur les icônes de la barre de titre. Plusieurs images sont acceptées pour permettre différentes tailles d'images (par exemple, 16x16 et 32x32) à fournir. La fenêtre gestionnaire peut redimensionner les icônes fournies à une taille appropriée. Sous Windows, les images sont regroupées dans une structure d'icônes Windows. Cette volonté remplacer un ico spécifié à wm iconbitmap, et inversement.

Sur X, les images sont organisées dans la propriété X _NET_WM_ICON, qui la plupart des gestionnaires de fenêtres modernes prennent en charge. Un wm iconbitmap peut exister simultanément. Il est recommandé de ne pas utiliser plus de 2 icônes, placer la plus grande icône en premier.

Sur Macintosh, la première image appelée est chargée dans une icône native OSX format et devient l'icône de l'application dans les boîtes de dialogue, le Dock et d'autres contextes. Au niveau du script, la commande n'acceptera que le première image transmise dans les paramètres en tant que prise en charge de plusieurs fichiers Les tailles/résolutions sur macOS sont hors de portée de Tk. Les développeurs devraient utilisez la plus grande icône qu’ils peuvent prendre en charge (de préférence 512 pixels) pour assurer un rendu lisse sur le Mac.

J'ai testé cela sur Windows pour m'assurer qu'il fonctionne au moins là-bas. J'ai utilisé une image carrée bleue pour tester.

Si les documentations ci-dessus sont exactes, cela devrait également fonctionner sur MAC.

 enter image description here

3
Mike - SMT

Remarque importante: Cette méthode est longue et demande beaucoup de travail. Cependant, cela apporte des avantages sans rapport. Notez qu'il existe peut-être un meilleur moyen, mais cela fonctionnera .
En tout cas, passons à autre chose ....

Vous pouvez utiliser py2app.

Py2app transformera votre programme en .app, ce qui signifie qu'il s'exécute en tant qu'application (car c'est le cas). Lorsque vous utilisez tkinter, c'est ce que vous voulez en fin de compte, car les interfaces graphiques sont généralement transformées en applications pour faciliter leur utilisation. Vous pouvez lire la documentation de py2app ici , ou lire un tutoriel non officiel mais plus facile à comprendre (à mon avis) ici . Je vais aussi résumer comment faire le processus.

Installez d'abord py2app: Entrez ceci dans la commande Invite:

Sudo pip install -U py2app

Si vous réussissez, vous devriez obtenir py2app. Sinon, vous pourriez ne pas avoir pip. Vous pouvez le télécharger avec une autre commande:

Sudo easy_install pip

Première étape: Créez un fichier appelé setup.py dans le même dictionnaire Que le programme.

Deuxième étape: Mettez ceci dans le fichier.

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'],
)

Étape 3: Ensuite, ouvrez le terminal bash dans le dictionnaire dans lequel se trouve le fichier et tapez cette commande:

python setup.py py2app -A

Le -A permet à l'application de répondre aux mises à jour du code, mais rend l'application inébranlable. Lorsque vous avez fini de développer, réexécutez la commande, cette fois sans le -A, comme suit:

python setup.py py2app

Remarque: Il se peut que vous deviez utiliser la commande python3 setup.py py2... au lieu de python setup.py py2... pour un python 3 py2app.

Étape 4: Accédez à the dictionary your code is in/dist. Dans ce dossier sera votre application. (Le dossier dist aurait dû être créé à la troisième étape lorsque vous avez exécuté la commande.)

Pour les utilisateurs de Windows: py2app n’est pas ce qu’il faut utiliser, utilisez plutôt py2exe .

1
Ethan K888