Om man skriver lite kod i Python för husbehov, GIS-skript eller liknande, så kanske man funderat på om det går att skapa fristående program i Python.
Och visst går det. Har man QGIS installerat så är det dessutom ganska enkelt genom att man bygger programmet med Qt plattformen som ingår i installationen av QGIS.
Det finns flera sätt att koppla ett gränssnitt med fönster och knappar till pythonkoden, men det som jag tycker är enklast (kanske inte bäst) är att bygga gränssnittet först och sedan komplettera med koden.
I QtDesigner väljer man först en ”mall” att börja med och sedan hämtar man komponenter från en lista till vänster, till formulärfönstret. Dessa placerar man som man vill ha dem, och gör eventuella inställningar i objektens egenskaper till höger.
Det är speciellt bra att döpa komponenterna till något som är lätt att komma ihåg, eller som överensstämmer med det de är kopplade till (en textruta för namn kanske döps till txtNamn).
När man är nöjd med gränssnittet (det går att förhandsgranska med Ctrl + R), så sparar man det som en *.ui fil.
Beroende på vilket operativsystem man använder så kommer nästa steg att se lite olika ut. Man behöver köra ett program från terminalen/kommandoprompten och för Windows så kan man även behöva ange sökvägen till programmet om den inte finns med i miljövariablerna. Prova att skriva in pyuic5 i terminalen. Då bör du få ett felmeddelande om att det saknas lite variabler. Om kommandot är okänt så behöver du söka efter var programmet finns och använda hela sökvägen när du kör det.
pyuic5 -x mitt_program.ui -o mitt_program.py
Programmet körs från den katalog där man sparat ui-filen och kommer att generera en python-fil som man sedan kan öppna i valfri pythonredigerare.
Koden kan redigeras direkt här, men om man vill göra ändringar i gränssnittet så måste man kompilera om ui-filen till python, vilket skriver över eventuella ändringar.
Det är därför bättre att skapa ett ”huvudprogram” som importerar resurser i form av dialogfönstret.
import sys from PyQt5 import QtCore, QtGui, QtWidgets from mitt_program import Ui_Dialog # Här importeras koden från UI filen class MittGuiProgram(Ui_Dialog): def __init__(self, dialog): Ui_Dialog.__init__(self) self.setupUi(dialog) # Koppla "btnPush" knappen till en funktion (addInputTextToLabel) self.btnPush.clicked.connect(self.addInputTextToLabel) def addInputTextToLabel(self): # Detta är guifunktionen som anropas när knappen trycks ner txt = self.lineEdit.text() self.label.setText(txt) if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) dialog = QtWidgets.QDialog() prog = MittGuiProgram(dialog) dialog.show() sys.exit(app.exec_())
Programmet skall ha minst en klass som skapar kopplingen till ui-filen från importen i början. I klassen skapar man även de kopplingar som behöver göras till exempelvis knappar i gränssnittet. I min fil ovan så skall något hända när man klickar på knappen ”btnPush”. Den action som man anropar blir en egen funktion i klassen och i mitt fall så läser funktionen innehållet i textfältet och skriver detta till en etikett.
För att något skall hända så behöver allt initieras, vilket görs i den sista if satsen (if __name__ == ‘__main__’:). Om programmet körs fristående så exekveras det som står i denna if-sats i Python. Här skapas instanser av Qt applikationen och en dialog, som sedan tilldelas egenskaper från den tidigare skapade klassen och när det är klart visar den på skärmen.
Mitt exempel här är inte speciellt avancerat men det går att skapa i princip hur komplicerad kod man vill för exempelvis beräkningar.
Det finns även betydligt mer avancerade komponenter att lägga till i gränssnittet om man vill det, men även en massa extra tillägg om dessa inte räcker.
Sedan har man ju tillgång till alla pythonbibliotek som man normalt använder och som kan tillföra i princip vilken funktionalitet som helst till ett program.
För att köra programmet så krävs det två saker. Dels python, i rätt version. Annars kan man inte starta programmet:
python3 mitt_program.py
Dessutom så behöver man lite Qt filer på datorn som skall köra programmet. Om du skall köra på den egna datorn så är det inga problem, då har du redan allt du behöver.
Vill du distribuera ditt ”program” så kan du använda pyinstaller som kan installeras med pip3 install pyinstaller.
Pyinstaller körs sedan på den pythonfil som normalt startar programmet. Detta skapar ett antal kataloger och filer med kompilerad binärkod av programmet och alla beroenden. Vill man bara ha ”en” körbar fil så kan man lägga till ett tillägg i kommandot.
pyinstaller --onefile mitt_program.py
Det är sannolikt fortfarande så att du behöver några filer extra för att programmet skall gå att köra, men alla filer du behöver finns i underkataloger i projektmappen. Observera att de binära filerna blir mycket större än pythonfilerna! Det beror på att alla, eller väldigt många, beroenden bakas in i filen.
Om du bygger på Windows så skapas en *.exe fil och på MacOS så antar jag att det blir något motsvarande. På Linux skapas en exekverbar fil i underkatalogen ”dist”. Observera att du inte kan bygga körbara filer för Mac eller Linux från en Windowsdator, eller tvärt om. Du måste ha en dator med det operativsystem du vill köra programmet på när du skapar det med pyinstaller.
Så med Qt Designer och Python så kan man inte bara skriva små kluriga tillägg och funktioner i QGIS, utan även hela program med egna gränssnitt som man kan dela med andra.