TigerJython4Kids
HomeTurtlegrafikRobotikDatenbanken
bilddatenbank

11. BILDDATENBANK

 

 

DU LERNST HIER...

 

wie du eine Datenbank dafür verwenden kannst, digitalisierte Bilder in  Tabellenfeldern abzuspeichern. So wie Text, kannst du auch die Pixel eines Bildes in Bytes codieren, beispielsweise den Rot-, Grün- und Blauanteil in drei Bytes R,G,B, die du als Zahlen 0..255 auffassen kannst.

 

 

MUSTERBEISPIEL

 

Du willst zu jeder Person einer Personendatenbank auch noch ihr Foto abspeichern. Wiederum gehst du von der Tabelle persons aus, so wie du sie bereits im Kapitel 3 verwendet hast, fügst aber ein zusätzliches Feld "image" hinzu. Die Personenbilder im Bildformat GIF, PNG oder JPG müssen sich im gleichen Verzeichnis wie das Programm befinden. Hast du gerade keine Bilder zur Verfügung, so kannst du ein kleine Bildsammlung mit 24 Cartoons von hier herunterladen und auspacken. Die Funktion getBytes(filename) liest die binären Daten aus der angegebenen Bilddatei und  stellt sie als Bytebuffer zur Verfügung. Sie können genau gleich wie andere Felder bei insert() angegeben werden.

from dbtable import *

lia = getBytes("lia.png")
luca = getBytes("luca.png")
tim = getBytes("tim.png")
jan = getBytes("jan.png")
noah = getBytes("noah.png")
nina = getBytes("nina.png")

persons = DbTable('id', 'name', 'vorname', 'wohnort', 
                 'geschlecht', 'jahrgang', 'image') 
persons.insert(1,'Huber','Lia','Bern','w', 2002, lia)
persons.insert(2,'Meier','Luca','Basel','m', 2003, luca)
persons.insert(3,'Frech','Tim','Bern','m', 2000, tim)
persons.insert(4,'Bauer','Jan','Luzern','m', 2003, jan)
persons.insert(5,'Zwahlen','Noah','Thun','m', 2002, noah)
persons.insert(6,'Meier','Nina','Biel','w', 2001, nina)
print(persons) 
persons.save('schule.db')         
► In Zwischenablage kopieren

Beim Ausschreiben der Tabelle mit print "siehst" du die Bilder allerdings nur als Bytewerte. Um sie als Bild anzuzeigen, benötigst du ein Grafikfenster (hier ein Turtlefenster) und durchläufst in einer for-Schleife die einzelnen Zeilen.

from dbtable import *
from gturtle import *

makeTurtle()
ht()
pu()
persons = DbTable()
persons.restore('schule.db')
x = -320
for record in persons:
    setPos(x, 0)
    drawImage(record.image)
    setPos(x, -100)
    label(record.vorname + " " + record.name, adjust = 'c')
    x += 130
► In Zwischenablage kopieren

Ergebnis:


Lia Huber
Luca Meier
Tim Frech
Jan Bauer
Noah Zwahlen
Nina Meier
           

 

 

MERKE DIR...

 

Um Bilder in eine Tabelle einzufügen, musst du diese mit getBytes() als Bytebuffer einlesen und sie in insert() angeben. Nachher kannst du alle Tabellenoperationen wie üblich anwenden.

 

 

ZUM SELBST LÖSEN

 
1.

Erstelle eine Personendatenbank mit eigenen Bildern.

2.

Schreibe ein Programm, das wiederholt in einem Eingabedialog einen Vornamen abfragt und dann den Vornamen, Namen, Wohnort und Foto im Turtlefenster anzeigt.


3a.

Im Folgenden verwendest du die Tabelle countries von der Datenbank tigerjython.db aus der Distribution von TigerJython.  Schreib diese Tabelle im Ausgabefenster aus und schau dir die Feldnamen und die Daten deines Heimatlandes an. Die siehst hier auch den zweistelligen country_code aller Länder.


3b.

Die Tabelle flags aus der Datenbank tigerjython.db enthält den country_code und die Landesflagge im GIF-Format. Schreibe ein Programm, das wiederholt als Eingabe den country_code verlangt und dann in einem Turtlefenster die Flagge anzeigt.


3c.

Wie 3b, aber es wird noch der Name des Landes unterhalb der Flagge ausgeschrieben.


3d.

Wie 3c, aber fang den Fehler ab, falls man einen falschen country_code eingibt.


4.

Erstelle ein Quiz wie folgt: Es erscheint eine zufällige Landesflagge und darunter werden die Namen von drei Länder in der Reihenfolge 1, 2, 3 ausgeschrieben. Eines der Länder entspricht der gezeigten Flagge. In einem Eingabedialog wird der Spieler aufgefordert, das Land der  Flagge  anzugeben (als Zahl 1, 2, 3). In einem Messagedialog wird der Erfolg/Misserfolg  und  das richtige Land ausgeschrieben. Man kann solange spielen, bis man im Eingabedialog "Abbrechen" wählt.


     
11-1
Fachliche Hinweise:

Ein solches Tabellenfeld besitzt den Datentyp BLOB (Binary Large OBject) und kann in SQLite bis über 1 GB gross sein.

11-2
Fachliche Hinweise:

Du kannst auch einen absoluten Pfad angeben.