image image


image

Worknote: TigerJython und das aktuelle Arbeitsverzeichnis

Als ich in meiner frisch erwachten Begeisterung für TigerJython ein paar alte Skripte wieder anwerfen wollte, erlebte ich eine böse Überraschung: Falls diese Skripte Bilder oder andere Assets laden sollten, fanden sie auf einmal den Pfad zu den Verzeichnissen nicht mehr: Ich hatte seit knapp einem Jahr nichts mehr mit TigerJython angestellt, daher kann ich nicht sagen, ob dieses Verhalten dem zwischenzeitlich erfolgten Update auf TigerJython 2.21 (vom Juli 2021) geschuldet ist, oder ob mein Update auf macOS Catalina dem Tiger in die Suppe spuckte (was ich vermute).

Und auch, ob dieses Verhalten nur bei der TigerJython-Bibliothek GameGrid auftritt, oder ob noch andere Bibliotheken (GTurtle, GPanel oder die Roboter-Module) betroffen sind, weiß ich nicht, aber ich habe eine Lösung/einen Workaround. Die Python-Bibliothek os ist in diesem Fall mein Freund, denn os.getcwd() liefert mir das aktuelle Arbeitsverzeichnis (current working directory) und mit os.path.join() kann ich dies mit dem relativen Pfad zur Datei verschweißen. Aus dem nicht mehr funktionierenden

win = GameGrid(WIDTH, HEIGHT, 1, None, "sprites/background.png"), False)

wird mit

win = GameGrid(WIDTH, HEIGHT, 1, None, os.path.join(os.getcwd(), "sprites/background.png"), False)

wieder ein funktionierender Befehl. Dabei können auch durchaus kombliziertere Konstrukte wie

Actor.__init__(self, True, os.path.join(os.getcwd(), "sprites/fish") + str(randint(1, 7)) + ".png", 2)

gewählt werden, solange die Syntaxregeln von Python nicht verletzt werden, ist alles möglich. Natürlich dürft Ihr nicht vergessen, das Modul os vorher zu importieren.

Ich habe damit unter anderem mein kleines, bonbonbuntes Aquarium vom Februar letzten Jahres repariert. Da das nun schon eine Weile zurückliegt, hier der komplette, geänderte Quellcode:

from gamegrid import *
from random import randint
import os

WIDTH = 640
HEIGHT = 416
NFISHES = 12  # Anzahl der Fische

dt = 20  # delta time

class Fish(Actor):
       
    def __init__(self):
        Actor.__init__(self, True, os.path.join(os.getcwd(), "sprites/fish") + str(randint(1, 7)) + ".png", 2)
        self.speed = randint(-3, 3)
        if self.speed < 0:
            self.setHorzMirror(True)
        elif self.speed == 0:
            self.speed = randint(1, 3)
            
        self.timer = 5
    
    def act(self):
        self.move(self.speed)
        if self.getX() > 600:
            self.setHorzMirror(True)
            self.speed = -randint(1, 3)
        if self.getX() < 40:
            self.setHorzMirror(False)
            self.speed = randint(1, 3)
        if self.timer == 0:
            self.showNextSprite()
            self.timer = 5
        self.timer -= 1

win = GameGrid(WIDTH, HEIGHT, 1, None, os.path.join(os.getcwd(), "sprites/background.png"), False)
win.setBgColor(49, 197, 244)
win.setTitle(u"Jörgs Aquarium")

x = 40
y = 30
for _ in range(NFISHES):
    fish = Fish()
    win.addActor(fish, Location(x, y))
    x += randint(30, 60)
    y += randint(10, 40)

win.setSimulationPeriod(dt)
win.show()
win.doRun()

Den Quellcode und die Assets findet Ihr auch in meinem GitHub-Repositorium zu TigerJython, wobei ich gerne noch einmal darauf hinweise, daß die Sprites aus dem freien (CC0 1.0) Fish Pack von Kenney.nl entnommen sind.


(Kommentieren) 

image image



Über …

Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter Rentner, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!

Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.

Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.

Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.


Werbung

Diese Spalte wurde absichtlich leergelassen!


Werbung


image  image  image
image  image  image


image