KI Elemente

Viele Teile ergeben ein Ganzes! Die Kunst unwichtige Details zu vermeiden!

Deployment - Softwareverteilung

Ziel ist es, auf irgendeinem Computer das Programm ausführen zu lassen. Eine selbstausführende Anwendung. (Standalone executable)

Dieser Vorgang heißt in der Pythonwelt "Freezing". Es gibt dafür alle möglichen Bibliotheken und leider haben diese meistens ein Problem mit QT.

Aber es gibt eine Bibliothek, die gut mit QT umgehen kann, der Name ist: "fbs" (Eine spezialisierte Softwar für Python und QT)

Zunächst relativ allgemein und dann für den Test - Texteditor.

Installation:

pip install fbs

Die einzelnen Schritte:

Ein neues fbs - Projekt starten:

fbs startproject







Ein Blick auf die Datei main.py

from fbs_runtime.application_context.PyQt5 import ApplicationContext
from PyQt5.QtWidgets import QMainWindow

import sys

if __name__ == '__main__':
appctxt = ApplicationContext() # 1. Instantiate ApplicationContext
window = QMainWindow()
window.resize(250, 150)
window.show()
exit_code = appctxt.app.exec_() # 2. Invoke appctxt.app.exec_()
sys.exit(exit_code)

Die APP einfrieren - FREEZE the app: Erzeugen einer ausführbaren Datei.

fbs freeze


In diesem Ordner befindet sich "MeinTexteditor.exe" als ausführbare Datei.

Diesen Ordner kann man auf jeden Rechner mit dem gleichen Betriebssystem kopieren und dort die exe Datei ausführen.

Ein automatisiertes Installationsprogramm

Um das Installationskommando in Windows aufrufen zu können, muss NSIS installiert werden. Eine Installations APP, incl. Uninstaller.


Link: https://sourceforge.net/projects/nis/


Teil 2: Schritt für Schritt für den Texteditor!

Zuerst src/Verzeichnis und Target löschen, wenn die vorige Anleitung durchgemacht wurde.

Start:

fbs startproject


fbs run 

Testfenster - alles ok.

from fbs_runtime.application_context.PyQt5 import ApplicationContext
from PyQt5.QtWidgets import QMainWindow

import sys

if __name__ == '__main__':
appctxt = ApplicationContext() # 1. Instantiate ApplicationContext
window = QMainWindow()
window.resize(250, 150)
window.show()
exit_code = appctxt.app.exec_() # 2. Invoke appctxt.app.exec_()
sys.exit(exit_code)

if - Statement und die Anfangsleerzeichen in den folgenden Zeilen entfernen.

from fbs_runtime.application_context.PyQt5 import ApplicationContext
from PyQt5.QtWidgets import QMainWindow

import sys

appctxt = ApplicationContext()
window = QMainWindow()
window.resize(250, 150)
window.show()
exit_code = appctxt.app.exec_()
sys.exit(exit_code)

Folgende Zeilen auswechseln:

window = QMainWindow()

window.resize(250, 150)

window.show()

.... und durch den Code des Texteditors ersetzen.

Folgende Zeile eintfernen:

app.exec_()

...

app = QApplication([])

..

app.setApplicationName("Text Editor")


---------------------

Hier der Code bis jetzt:

from fbs_runtime.application_context.PyQt5 import ApplicationContext
from PyQt5.QtWidgets import QMainWindow

# PyQt Bibliotheken importieren
from PyQt5.QtWidgets import *

# Tastatur Schnellzugriff
from PyQt5.QtGui import QKeySequence

import sys

appctxt = ApplicationContext()



# Textfeld definieren
text = QPlainTextEdit()
# Fenster definieren
window = QMainWindow()
# Fenstertitel festlegen
window.setWindowTitle("Text Editor")
# Textfeld im Fenster zentrieren
window.setCentralWidget(text)
# Datei - Menü definieren
menu = window.menuBar().addMenu("&Datei")
# Ereignis close definieren - Tastenkürzel
close = QAction("S&chliessen")
# close Ereignis auslösen - Signal
close.triggered.connect(window.close)
# Aktion close dem Menü zuweisen
menu.addAction(close)
# Hilfe Menü - About Dialog ----------------------------
help_menu = window.menuBar().addMenu("&Hilfe")
about_action = QAction("&Ueber")
help_menu.addAction(about_action)
def show_about_dialog():
text = "<center>" \
"<h1>Text Editor</h1>" \
"&#8291;" \
"<img src=EinVectorIcon.svg>" \
"</center>" \
"<p>Version 27.1.2021<br/>" \
"Copyright &copy; Die Firma Soundso ....</p>"
QMessageBox.about(window, "About Text Editor", text)
about_action.triggered.connect(show_about_dialog)
# ------------------------------------------------------
# Datei öffnen -----------------------------------------
open_action = QAction("&Oeffnen")
global file_path
def open_file():
path = QFileDialog.getOpenFileName(window, "Oeffnen")[0]
if path:
text.setPlainText(open(path).read())
file_path = path
open_action.triggered.connect(open_file)
menu.addAction(open_action)
open_action.setShortcut(QKeySequence.Open)
# ------------------------------------------------------
# Datei speichern unter --------------------------------
save_as_action = QAction("Speichern &unter...")
global file_path
def save_as():
path = QFileDialog.getSaveFileName(window, "Speichern unter")[0]
if path:
file_path = path
save()
save_as_action.triggered.connect(save_as)
menu.addAction(save_as_action)
# ------------------------------------------------------
# Datei speichern --------------------------------------
file_path = None
save_action = QAction("&Speichern")
def save():
if file_path is None:
save_as()
else:
with open(file_path, "w") as f:
f.write(text.toPlainText())
save_action.triggered.connect(save)
save_action.setShortcut(QKeySequence.Save)
menu.addAction(save_action)
# ------------------------------------------------------
# ------------------------------------------------------
# Fenster anzeigen
window.show()



exit_code = appctxt.app.exec_()
sys.exit(exit_code)

Ein Test: 

fbs run


Nun den Text editor zusammenpacken:

fbs freeze

Bei Erfolg:

(base) C:\Users\estuh\OneDrive - BHAK Judenburg\StuE2021\Ki_Rezepte_2021_StuE>fbs freeze Done. You can now run `target\TextEditor\TextEditor.exe`. If that doesn't work, see https://build-system.fman.io/troubleshooting. 

In diesem Ordner befindet sich nun die ausführbare exe - Datei:



Diesen Ordner kann man nun auf einen anderen Rechner kopieren (gleiches Betriebssysem) und die Datei TextEditor.exe ausführen.


Einen "Installer" erzeugen:

NSIS - mit richtigem Pfad muss installiert sein.

fbs installer




uww.

.......................




KI

Copyright © 2021. All Rights Reserved. Ehrenfried Stuhlpfarrer