[PYTHON] Erstellen Sie eine mit tkinter erstellte ausführbare GUI-Datei

Eines Tages

Ich habe in Python ein Skript erstellt, das einen externen Prozess zum Ausführen eines externen Tools verwendet, und ich habe etwas erstellt, das durch Drücken eines Python-Befehls ausgeführt werden kann. (Kurz gesagt, ein Wrapper für externe Werkzeuge)

Der Benutzer ist jedoch nicht die Person, die das Terminal öffnet und verwendet. Daher bin ich froh, dass ich mit der GUI darauf klicken kann.

Und wie immer viele süchtig machende Tage.

tkinter (PySimpleGUI)

Es scheint, dass Python standardmäßig mit einem GUI-Toolkit namens ** tkinter [^ 1] ** geliefert wird. Wenn Sie dies verwenden, können Sie anscheinend eine grafische Benutzeroberfläche erstellen, auch wenn diese nur vorübergehend ist.

Als ich Google Sensei fragte, kam ich zu dem Artikel Wenn Sie Tkinter verwenden, versuchen Sie es mit PySimpleGUI ** PySimpleGUI [^ 2] ] ** Ich bin auf eine Wrapper-Bibliothek für tkinter (und Qt, WxPython, Remi) gestoßen.

Wenn Sie neben tkinter auch Qt, WxPython und Remi verwenden, wissen Sie, dass Sie mit Python eine GUI erstellen können. (Ich möchte keine GUI in Python separat erstellen, sondern nur eine GUI, mit der Python-Code problemlos ausgeführt werden kann. In Wirklichkeit ist also alles in Ordnung.)

tkinter ist nicht installiert ?? </ font>

Ich habe Hello World sofort unter Bezugnahme auf PySimpleGUI --Jump Start ausprobiert, leide aber immer noch unter dem folgenden Fehler.

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 sollte nicht schlecht sein, daher wird es mit dem folgenden in Tcl / Tk Python Interface beschriebenen Befehl korrekt installiert. Überprüfen Sie, ob dies der Fall ist.

Terminal


$ python -m tkinter

Natürlich wird der gleiche Fehler angezeigt, da er anscheinend nicht korrekt installiert wurde.

Obwohl die Beschreibung verzögert wurde, ist diese Umgebung wie folgt.

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

Der Artikel, auf den ich in dieser Ausgabe verwiesen habe, lautet Verwendung von tkinter mit Python in pyenv. Dieser Artikel war genau die Antwort, weil ich pyenv benutze.

Sie sollten etwas namens "tcl-tk" mit Brew installieren. Außerdem wäre es schön, Python neu zu installieren, indem beim Erstellen von Python Optionen hinzugefügt werden. Überprüfen Sie, ob die Installation mit dem vorherigen Befehl erfolgreich war.

Terminal


$ python -m tkinter
20200509152812.png

Es scheint kein Problem zu geben!

Versuchen Sie als Nächstes, Hello World of PySimpleGUI auszuführen.

20200509153240.png

Es scheint kein Problem zu geben! !!

So starten Sie die implementierte GUI ... ?? </ font>

Zur Zeit ist Hello World vollständig, also erstellen wir tatsächlich eine GUI. Es gibt jedoch nur zwei Funktionen: "** Dateiauswahldialog ** ermöglicht die Auswahl einer Datei" und "** Schaltfläche Ausführen ** ermöglicht die Verwendung des ausgewählten Dateipfads".

Sie können nicht einfach auf eine mit PySimpleGUI implementierte Python-Datei doppelklicken, um die GUI tatsächlich zu starten. Schließlich müssen Sie einen Python-Befehl wie folgt eingeben:

#GUI, die GUI implementiert.py(Temporär)Ausführen.
$ python gui.py

Damit hat sich das Ausführungsziel von einer Python-Datei **, die einen Unterprozess verwendet, zu einer Python-Datei ** geändert, die PySimpleGUI verwendet, und es ist der Ausführung vom Terminal nicht entkommen. Was ich hier tun möchte, ist, es wie eine normale ** Anwendung ** in das Dock zu legen und es mit einem Klick zu starten. Das ist.

py2app

Jetzt ist es Zeit, sich wieder auf Google Teacher zu verlassen. Ich habe mich mit verschiedenen Typen beschäftigt, aber ich habe mich für ** py2app [^ 3] ** entschieden. Hier habe ich auf den folgenden Artikel verwiesen. Erstellen Sie eine native Mac-App mit py2app

Der Arbeitsablauf ist wie folgt.

  1. Installieren Sie py2app mit pip
  2. Generieren Sie ein Setup-Skript mit py2app
  3. Führen Sie das Skript aus (erstellen Sie es) ← Hier Fehler </ font>

Fehler im Setup-Skript ?? </ font>

Terminal


$ python setup.py py2app
~ Abkürzung ~
ValueError: '/Users/chibi/.pyenv/versions/3.8.2/lib/libpython3.8.dylib' does not exist

Es gibt keine .dylib ~. Wenn ich es mir tatsächlich ansehe, habe ich "libpython3.8.a", aber nicht ".dylib".

[Machen Sie es zu einer eigenständigen App auf Python Mac](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) Wenn Sie darauf verweisen, können Sie mit den Parametern von setup.py spielen. .. .. Da es in meiner Umgebung Python 3.8.2 ist, werde ich es mit einigen Änderungen versuchen.

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

Nein, als ich das ausprobiert habe, gibt es in "/ Users / chibi / .pyenv / version / 3.8.2 / lib /" keine ".dylib", also kann ich es nicht tun. Ich sehe Leute in der Anaconda-Umgebung, wie ältere Versionen, aber ich frage mich, ob es von Anfang an eine ".dylib" in einer anderen Umgebung gibt.

Ich habe beschlossen, die vorhandene ".a" als Testversion zu verwenden, aber meine Erwartungen waren leer und es war nutzlos.

Eigentlich versucht setup.py (faltbar)

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

Anscheinend funktioniert die statische Bibliothek nicht und ich muss eine gemeinsam genutzte Bibliothek vorbereiten.

In pyenv scheint es nur erforderlich zu sein, zum Zeitpunkt der Installation "PYTHON_CONFIGURE_OPTS =" --enable-framework "" zu haben. Dann scheint es, dass "libpython" als gemeinsam genutzte Bibliothek platziert wird. Ähnlich wie bei tkinter scheint es nicht genügend Optionen zu geben, wenn Sie durch pyenv gehen. Da PYTHON_CONFIGURE_OPTS eine Umgebungsvariable ist, die auch für tkinter benötigt wurde, werde ich --enable-framework hinzufügen und versuchen, Python erneut zu installieren.

Wenn alles gut geht, haben Sie dist / xxx.app. Übrigens sollte zu diesem Zeitpunkt die oben erwähnte setup.py als Standard beibehalten werden. Mit anderen Worten, "OPTIONEN" können als leeres Array belassen werden.

Doppelklicken Sie auf "xxx.app", um es zu öffnen. .. ..

20200510180322.png

So was. Sie können eine Datei auswählen und es gibt eine Schaltfläche zum Ausführen.

Der Pfad wird in der GUI nicht übergeben? </ font>

Als ich versuchte, den Vorgang zu überprüfen, wurde mir mitgeteilt, dass der intern ausgeführte Befehl "which command" kein bestimmtes externes Tool enthält. Da der PATH selbst in ".bashrc" und ".bash_profile" geschrieben ist, scheint sich der Pfad vom Terminal aus im Status zu befinden, aber der Pfad befindet sich nicht im Status der GUI. Wie registrieren Sie Umgebungsvariablen wie Windows?

Siehe Informationen zum Festlegen von Umgebungsvariablen für GUI-Apps unter macOS.

Terminal


$ sudo launchctl config user path <PFAD-Informationen, die Sie festlegen möchten>

Sie können es so einstellen. Es muss auch neu gestartet werden. Übrigens, wie im obigen Artikel geschrieben, wird der von launchctl festgelegte Pfad im Folgenden gespeichert. /var/db/com.apple.xpc.launchd/config/user.plist

Nach dem Neustart funktionierte der Unterprozess beim Ausführen des von mir erneut erstellten Tools wie erwartet und das Ausführungsergebnis war wie erwartet.

Zusammenfassung

Ich war süchtig nach verschiedenen Dingen, aber ein kleines Tool, das wie erwartet funktioniert, wurde fertiggestellt.

  • GUI
    • tkinter (PySimpleGUI)
    • tcl-tk
  • Festlegen von Umgebungsvariablen für die Python-Installation (tcl, tk related) --Ausführbare Datei
    • py2app
  • Festlegen von Umgebungsvariablen für die Python-Installation (--enable-framework)
  • GUI-Umgebungsvariablen
    • launchctl

[^ 1]: Tcl / Tk Python-Schnittstelle

Recommended Posts