aa_module

Übersicht: Python & Blender


Lernziel

Umfangreiche Projekte lassen sich nicht mehr in einer Datei verwalten. Der Quellcode wird schnell unübersichtlich. Deshalb gibt es, wie in anderen Sprachen auch, für Python eine Lösung, die hier gezeigt wird.

Handlungsanweisungen

Aufgaben:
  1. Lagere Teile des Quellcode in eine zweite Datei (levels.py) aus.
  2. Importiere anschließend die ausgelagerten Teile.
  3. Prüfe, ob das aus zwei Teilen bestehende Programm, wie zuvor funktioniert.
  4. Füge einen dritten Level in die Datei levels.py ein.

Das Modul für die Level

Hier finden wir die Level-Definitionen, die vorher in unserem Hauptprogramm integriert waren. Speichere die Level-Definitionen in der Datei levels.py. Die zwei Dateien haben nun den Vorteil, das die Arbeit aufgeteilt werden kann. Ein Programmierer oder Game-Designer entwirft neue Spiele-Level. Der Zweite Programmierer kann sie in das Hauptprgramm einbinden. Auch wird der Quelltext damit sehr viel übersichtlicher und kann vielleicht sogar in Teilen wiederverwendet werden.

blender-extended/levels.py (Source)

#! bpy
"""
Name: 'levels.py'
Blender: 269
Group: 'Modules'
Tooltip: 'Maze definitions'
"""

level_00 = ["###################",
            "#.                #",
            "#        $        #",
            "#                 #",
            "#                 #",
            "#        @        #",
            "#                 #",
            "#                 #",
            "#                 #",
            "#                 #",
            "###################"]


level_01 = ["    #####           ",
            "    #   #           ",
            "    #$  #           ",
            "  ###  $##          ",
            "  #  $ $ #          ",
            "### # ## #   ###### ",
            "#   # ## #####  ..# ",
            "# $  $          ..# ",
            "##### ### #@##  ..# ",
            "    #     ######### ",
            "    #######         "]

Das Labyrinth

Die Wiederverwendung von Quellcode aus anderen Dateien (eventuell von anderen Autoren/Programmierern wird mit einem Import realisiert. Er führt die beiden Teile wieder zusammen.

blender-extended/sokoban_m1.py (Source)

from levels import level_00
from levels import level_01

Fehler

Immer wieder treten Fehler auf und es gilt die Ursache zu finden. Mir ist hier z.B. ein kleiner Schreibfehler unterlaufen. Die Fehler werden immer in der Konsole ausgegeben.

Traceback (most recent call last):
File "/Users/.../sokoban2.py", line 10, in <module>
ImportError: cannot import name Level_01
Error: Python script fail, look in the console for now...

Der Pfad ist von mir gekürzt, wenn aber ein Fehler auftritt, dann bekommt man einen Traceback und ein paar nützliche Informationen. Wichtig ist hier die Zeilennummer, die oft zur problematischen Stelle im Quellcode führt. Noch wichtiger ist der Fehler-Typ, in meinem Fall ein Import-Fehler, weil ich Level_01 mit einem großen L statt einem kleinen l geschrieben habe.

Module finden

Nun ist der Quellcode nach Aufgabenbereichen sauber getrennt. Dafür haben wir jetzt ein wenig mehr Verwaltungsaufwand!

Python ohne Blender hat einen Mechnanismus, in einer Liste von Pfaden nach Modulen zu suchen. Diese Liste kann man sich an der Konsole, mit Hilfe von sys, anzeigen lassen.

>>>import sys
>>>sys.path
["Hier steht eine lange Liste mit vielen Pfadangaben ..."]

Weil die Liste sehr lang ist, ist sie hier durch einen Hinweis ersetzt. Wenn Du den Befehl sys.path ausführst, siehst Du auf jedem Rechner andere Pfade.

Blenderdatei und Python-Skripte verbinden

Weil der klassische Trick, die Liste der Pfade in sys.path zu verlängern, in Blender keine Wirkung hat, müssen wir die Skripte an die Blender-Datei (.blend) binden.

Nach diesem einmaligen Konfigurationsschritt gehören die Skripte, wie die Objekte, Fenstereinstellungen u.a. zu einer Blender-Datei. Alles wird mit dem Aufruf der Blender-Datei geladen und steht zur Ausführung und Ansicht bereit.

Was ist zu tun?

  1. Neue Blender-Datei erstellen.

  2. Module und Hauptprogramm in das Textfenster laden.

  3. Nacheinander alle Dateien, die zusammen gehören, auswählen und über das Menü:

    Text | Make internal

    an die Blender-Datei binden.

/blender-extended/make-internal.png

Nun kann die Blender-Datei gespeichert werden und das Laden der Module sowie das Hauptprogramm sollten funktionieren.

Externe Editoren

Der interne Editor ist ganz praktisch, ist er doch perfekt in die Entwicklungsumgebung von Blender integriert. Kann ich trotzdem meinen Lieblingseditor verwenden, sei es der emacs und vi unter Linux oder PyCharme und Notpad++ unter Windows, um Python-Scripte editieren zu können?

Wenn eine Python-Datei mit einem externen Editor bearbeitet wurde, wird das von Blender registriert und ein kleines Symbol zeigt den veränderten Zustand an. Mit einem Rechts-Klick kann die Syncronisation bzw. das Neuladen der Datei gestartet werden.

/blender-extended/out-of-sync.png

Kommentare