[PYTHON] Créer un fichier exécutable GUI créé avec tkinter

Un jour

J'ai créé un script en Python qui utilise un sous-processus pour exécuter un outil externe, et j'ai créé quelque chose qui peut être exécuté en appuyant sur une commande Python. (En bref, un wrapper pour les outils externes)

Cependant, l'utilisateur n'est pas la personne qui ouvre le terminal et l'utilise, je suis donc heureux de pouvoir cliquer dessus avec l'interface graphique.

Et, comme toujours, beaucoup de jours addictifs.

tkinter (PySimpleGUI)

Il semble que Python soit livré en standard avec une boîte à outils GUI appelée ** tkinter [^ 1] **. Si vous l'utilisez, il semble que vous puissiez créer une interface graphique même si elle est temporaire.

Quand j'ai demandé à Google Sensei, je suis arrivé à l'article Si vous utilisez Tkinter, essayez d'utiliser PySimpleGUI ** PySimpleGUI [^ 2] ] ** Je suis tombé sur une bibliothèque de wrapper pour tkinter (et Qt, WxPython, Remi).

Ici, en plus de tkinter, si vous utilisez Qt, WxPython, Remi, vous saurez que vous pouvez créer une interface graphique avec Python. (Je ne veux pas créer une interface graphique en Python séparément, je veux juste une interface graphique qui peut facilement exécuter du code Python, donc en réalité tout va bien)

tkinter n'est pas installé ?? </ font>

J'ai immédiatement essayé Hello World en me référant à PySimpleGUI --Jump Start, mais je souffre toujours de l'erreur suivante.

Terminal


$ python hello.py 
Traceback (most recent call last):
  File "hello.py", line 1, in <module>
    import PySimpleGUI as sg
  File "/Users/chibi/.pyenv/versions/3.8.2/lib/python3.8/site-packages/PySimpleGUI/__init__.py", line 2, in <module>
    from .PySimpleGUI import *
  File "/Users/chibi/.pyenv/versions/3.8.2/lib/python3.8/site-packages/PySimpleGUI/PySimpleGUI.py", line 103, in <module>
    import tkinter as tk
  File "/Users/chibi/.pyenv/versions/3.8.2/lib/python3.8/tkinter/__init__.py", line 36, in <module>
    import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'

PySimpleGUI ne devrait pas être mauvais, il sera donc installé correctement à partir de la commande suivante décrite dans Tcl / Tk Python Interface. Vérifiez si c'est le cas.

Terminal


$ python -m tkinter

Bien sûr, la même erreur s'affiche car il semble qu'elle n'a pas été installée correctement.

Bien qu'il ait été retardé à décrire, cet environnement est le suivant.

  • MacOS Catalina: 10.15.4
  • Python: 3.8.2
  • pip: 20.0.2

Et l'article auquel j'ai fait référence dans ce numéro est Comment utiliser tkinter avec python dans pyenv. Cet article était exactement la réponse car j'utilise pyenv.

Vous devriez installer quelque chose appelé tcl-tk avec brew. De plus, il serait bien de réinstaller Python en ajoutant des options lors de la construction de Python. Vérifiez si l'installation a réussi avec la commande précédente.

Terminal


$ python -m tkinter
20200509152812.png

Aucun problème!

Ensuite, essayez d'exécuter Hello World of PySimpleGUI.

20200509153240.png

Aucun problème! !!

Comment démarrer l'interface graphique implémentée ... ?? </ font>

Pour le moment, Hello World est terminé, alors créons une interface graphique. Cela dit, il n'y a que deux fonctions: "** Boîte de dialogue de sélection de fichier ** vous permet de sélectionner un fichier" et "** Bouton Exécuter ** vous permet d'utiliser le chemin du fichier sélectionné."

Vous ne pouvez pas simplement double-cliquer sur un fichier Python implémenté à l'aide de PySimpleGUI pour lancer réellement l'interface graphique. Après tout, vous devez entrer une commande Python comme celle-ci:

#Gui qui implémente GUI.py(Temporaire)Éxécuter.
$ python gui.py

Avec cela, la cible d'exécution est passée d'un fichier Python ** qui utilise un sous-processus à un fichier Python ** qui utilise PySimpleGUI, et il n'a pas échappé à l'exécution du terminal. Ce que je veux faire ici, c'est le mettre dans le Dock comme une ** application ** normale et le démarrer en un clic. C'est.

py2app

Il est maintenant temps de compter à nouveau sur Google Teacher. Je suis resté coincé avec plusieurs types, mais j'ai décidé d'utiliser ** py2app [^ 3] **. Ici, je me suis référé à l'article suivant. Créer une application Mac native avec py2app

Le flux de travail est le suivant.

  1. Installez py2app avec pip
  2. Générez un script d'installation avec py2app
  3. Exécuter (construire) le script ← Ici erreur </ font>

Erreur dans le script de configuration ?? </ font>

Terminal


$ python setup.py py2app
~ Abréviation ~
ValueError: '/Users/chibi/.pyenv/versions/3.8.2/lib/libpython3.8.dylib' does not exist

Il n'y a pas de «.dylib» ~. Quand je vais le voir, j'ai libpython3.8.a mais pas .dylib.

[Faites-en une application autonome sur Mac python](https://medium.com/@Dorobune/python-mac%E3%81%A7%E3%82%B9%E3%82%BF%E3%83%B3%E3 % 83% 89% E3% 82% A2% E3% 83% AD% E3% 83% B3% E3% 82% A2% E3% 83% 97% E3% 83% AA% E3% 81% AB% E3% 81 % 99% E3% 82% 8B-py2app-9ef3057519c) Si vous vous y référez, vous pouvez jouer avec les paramètres de setup.py. .. .. Puisqu'il s'agit de Python «3.8.2» dans mon environnement, je vais l'essayer avec quelques modifications.

setup.py


  from setuptools import setup

  APP = ['gui.py']
  DATA_FILES = []
- OPTIONS = {}
+ OPTIONS = {
+     'argv_emulation':True,
+     'plist': {
+         'PyRuntimeLocations': [
+             '@executable_path/../Frameworks/libpython3.8m.dylib',
+             '/Users/chibi/.pyenv/versions/3.8.2/lib/libpython3.8m.dylib'
+         ]
+     }
+ }

  setup(
      app=APP,
      data_files=DATA_FILES,
      options={'py2app': OPTIONS},
      setup_requires=['py2app'],
  )

Non, quand j'ai essayé cela, il n'y a pas de .dylib dans / Users / chibi / .pyenv / versions / 3.8.2 / lib /, donc je ne peux pas le faire. Je vois des gens dans l'environnement Anaconda, comme des versions plus anciennes, mais je me demande s'il y a un .dylib dans un autre environnement depuis le début.

J'ai décidé d'utiliser le «.a» existant comme un essai, mais mes attentes étaient vides et c'était inutile.

J'ai essayé setup.py (pliage)

setup.py


  from setuptools import setup

  APP = ['gui.py']
  DATA_FILES = []
  OPTIONS = {
      'argv_emulation':True,
      'plist': {
          'PyRuntimeLocations': [
              '@executable_path/../Frameworks/libpython3.8m.dylib',
-             '/Users/chibi/.pyenv/versions/3.8.2/lib/libpython3.8m.dylib'
+             '/Users/chibi/.pyenv/versions/3.8.2/lib/libpython3.8.a'
          ]
      }
  }

  setup(
      app=APP,
      data_files=DATA_FILES,
      options={'py2app': OPTIONS},
      setup_requires=['py2app'],
  )

Apparemment, la bibliothèque statique ne fonctionne pas et je dois préparer une bibliothèque partagée.

Dans pyenv, il semble qu'il ne soit nécessaire d'avoir PYTHON_CONFIGURE_OPTS =" --enable-framework " qu'au moment de l'installation. Ensuite, il semble que libpython soit placé en tant que bibliothèque partagée. Semblable à tkinter, il semble qu'il n'y ait pas assez d'options lorsque vous passez par pyenv. Puisque PYTHON_CONFIGURE_OPTS est une variable d'environnement qui était également nécessaire pour tkinter, je vais ajouter --enable-framework et essayer d'installer à nouveau Python.

Si tout se passe bien, vous aurez dist / xxx.app. Au fait, pour le moment, le setup.py mentionné ci-dessus devrait être laissé par défaut. En d'autres termes, «OPTIONS» peut être laissé sous forme de tableau vide.

Double-cliquez sur «xxx.app» pour l'ouvrir. .. ..

20200510180322.png

Comme ça. Vous pouvez sélectionner un fichier et il y a un bouton d'exécution.

Le chemin ne passe pas dans l'interface graphique ?? </ font>

Lorsque j'ai essayé de vérifier l'opération, on m'a dit qu'il n'y avait pas d'outil externe spécifique dans la commande which qui était exécuté en interne. Puisque le PATH lui-même est écrit en .bashrc et .bash_profile, il semble que le chemin soit dans l'état du terminal, mais le chemin n'est pas dans l'état de l'interface graphique. Comment enregistrez-vous des variables d'environnement comme Windows?

Voir Explorer comment définir des variables d'environnement pour les applications GUI sur macOS.

Terminal


$ sudo launchctl config user path <Informations PATH que vous souhaitez définir>

Vous pouvez le définir comme ceci. Il doit également être redémarré. En passant, comme il a été écrit dans l'article ci-dessus, le chemin défini par launchctl est enregistré dans ce qui suit. /var/db/com.apple.xpc.launchd/config/user.plist

Après le redémarrage, lorsque j'ai exécuté à nouveau l'outil que j'ai créé, le sous-processus a fonctionné comme prévu et le résultat de l'exécution était comme prévu.

Résumé

J'étais accro à diverses choses, mais un petit outil qui fonctionne comme prévu a été terminé.

  • GUI
    • tkinter (PySimpleGUI)
    • tcl-tk --Définir les variables d'environnement pour l'installation de Python (tcl, tk related) --Fichier exécutable
    • py2app --Définir les variables d'environnement pour l'installation de Python (--enable-framework)
  • Variables d'environnement GUI
    • launchctl

[^ 1]: Interface Tcl / Tk Python

Recommended Posts