Anzeige von 12 Bildern zyklisch erfolgen lassen

Fragen zu Tkinter.
wilhelmO
User
Beiträge: 34
Registriert: Mittwoch 17. August 2011, 14:40

Sorry my fault
sorted_images = images lautet es in im programm. "" habe ich versehentlich von
Hand eingefügt , als mich mit den Formatierungen vertippt hatte.
Da mein Verzeichnis auch keine Umlaute oder Sonderzeichen enthält , kann ich die Fehler-
meldung eben nicht nachvollziehen.

Im Kopf des Programms lasse ich mir zur Kontrolle nochmals den Inhalt von IMAGE_PATH
ausdrucken.
Er lautet dann korrekt : 'fpad = C:/Python26/AVTGIF

:?
BlackJack

@wilhelmO: Die Fehlermeldung enthält keinen Pfad. Das impliziert das Arbeitsverzeichnis des Prozesses und nicht ``C:/Python26/AVTGIF``. Da steht ja nicht das ``C:/Python26/AVTGIF/AVT000000001.GIF`` nicht gefunden werden konnte. So einen Dateinamen versuchst Du auch gar nicht zu öffnen.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi wilhelmO

Hier das überarbeitete Skript:

Code: Alles auswählen

import Tkinter as tk
from PIL import Image, ImageTk
import os

ROWS = 3
COLUMNS = 4
TITLE = "TK 5 FormenScan"
#IMAGE_PATH = os.getcwd() # wuf's Pfad
IMAGE_PATH = "C:/Python26/AVTGIF/" # wilhelmO's Pfad
IMAGE_FORMAT_FILTER = ['.gif', '.png', '.GIF', '.PNG']
RESIZE_IMAGE_WIDTH = 48 #200
RESIZE_IMAGE_HEIGHT = 48 #130
DELAY = 1000


class Image_Viewer(tk.Frame):
    
    def __init__(self, root):
        
        tk.Frame.__init__(self, root)
        self.pack()
          
        self.bilder()
       
    def bilder(self):
            
        self.images = self.load_images()
        
        for row, images in enumerate(self.images):
            for column, image in enumerate(images):
                self.label = tk.Label(self, image=image)
                self.label.grid(row=row, column=column)
                self.label.update() #_idletasks()
                self.label.after(DELAY, None)
                    
    def load_images(self):
        
        files = os.listdir(IMAGE_PATH)
        
        images = list()
        for file in files:
            for image_format in IMAGE_FORMAT_FILTER:
                if image_format in file:
                    images.append(file)

        images = sorted(images,reverse=True)
        
        sorted_images = list()
        for row in xrange(ROWS):
            row_list = list()
            for column in xrange(COLUMNS):
                try:
                    row_list.append(ImageTk.PhotoImage(Image.open(
                    os.path.join(IMAGE_PATH, images.pop())).resize(
                    (RESIZE_IMAGE_WIDTH, RESIZE_IMAGE_HEIGHT)
                    )))
                except IndexError:
                    break
            sorted_images.append(row_list)
            
        return sorted_images
     
if __name__ == '__main__':
    root = tk.Tk()
    #root.update() #_idletasks()
    root.title(TITLE)
    image_viewer = Image_Viewer(root)
    #image_viewer.pack()  
    root.mainloop()
Da ich unter Linux arbeite und mir nicht deine Windows-Datei-Baumstruktur zur Verfügung stand habe ich den Bildpfad mit:

Code: Alles auswählen

IMAGE_PATH = os.getcwd()
auf mein Arbeitsverzeichnis gesetzt wo ich auch die Bilder für den Test abgelegt habe. So funktionier das einlesen der Bilddateien aus dem Arbeitsverzeichnis korrekt mit der Anweisung:

Code: Alles auswählen

row_list.append(ImageTk.PhotoImage(Image.open(
images.pop()).resize(
(RESIZE_IMAGE_WIDTH, RESIZE_IMAGE_HEIGHT)
)))
Dass es auchin deinem Fall funktioniert muss dein Bilderpfad:

Code: Alles auswählen

IMAGE_PATH = "C:/Python26/AVTGIF/" # wilhelmO's Pfad
noch mit dem Namen der Bilddatei wie folgt zusammengehängt werden:

Code: Alles auswählen

 row_list.append(ImageTk.PhotoImage(Image.open(
os.path.join(IMAGE_PATH, images.pop())).resize(
(RESIZE_IMAGE_WIDTH, RESIZE_IMAGE_HEIGHT)
 )))
Jetzt aber sollte dein Skript zum laufen kommen.

Gruß wuf :wink:
Take it easy Mates!
wilhelmO
User
Beiträge: 34
Registriert: Mittwoch 17. August 2011, 14:40

Hallo wuf
Vielen Dank für Überarbeitung !
Den IMAGE_PATH hatte ich schon abgeändert, da ich durch Kontrollausdruck des Pfades sah,
daß IMAGE_PATH = os.getcwd() mir das python-Installations und nicht mein Arbeitsverzeichnis
liefert.
Mit os.path.join wird python anscheinend auf das korrekte Verzeichnis hingewiesen , bzw.
das Verzeichnis wird hinzugefügt.

soweit sogut -- Programm meckert aber trotzdem -- folgende Fehlermeldung erhalte ich :

File "D:\Eclipse_Python\TK5\src\test15.py", line 56, in load_images
row_list.append(ImageTk.PhotoImage(Image.open(os.path.join(IMAGE_PATH,images.pop())).resize(RESIZE_IMAGE_WIDTH,RESIZE_IMAGE_HEIGHT)))
File "C:\Python26\Lib\site-packages\PIL\Image.py", line 1288, in resize
raise ValueError("unknown resampling filter")
ValueError: unknown resampling filter

Ich hab in PIL nachgesehen und finde keine Erklärung , da im.resize(size) auch ohne Filteran-
gabe genutzt werden. Wenn ich nun als dritten Parameter einen Filter hinzufüge wird mit
'unkown filter' gemeckert.

Nochmals das Programm , wie nun in eclipse vorhanden und gestartet :

Code: Alles auswählen

import Tkinter as tk
from PIL import Image, ImageTk
import os

ROWS = 3
COLUMNS = 4
TITLE ="TK 5 Formenscan"
IMAGE_PATH = "C:\Python26\AVTGIF" #os.getcwd()
print 'fpad =',IMAGE_PATH
IMAGE_FORMAT_FILTER = ['.gif','.png','.GIF','.PNG']
RESIZE_IMAGE_WIDTH = 80
RESIZE_IMAGE_HEIGHT = 60
DELAY = 1000

class Image_Viewer(tk.Frame):
    
    def __init__(self,root):
        
        tk.Frame.__init__(self,root)
        self.pack()
        self.bilder()
        print '1'
        
    def bilder(self):
        
        self.images = self.load_images()
        
        for row , images in enumerate(self.images):
            for column, image in enumerate(images):
                self.label = tk.Label(self,image=image)
                self.label.grid(row=row, column=column)
                self.label.update()
                self.label.after(DELAY,None)
        print '2'
                
    def load_images(self):
        
        files = os.listdir(IMAGE_PATH)
        print '3'
        print 'files=',files
        images = list()
        for file in files:
            for image_format in IMAGE_FORMAT_FILTER:
                if image_format in file:
                    images.append(file)
        print '4'            
        images = sorted(images,reverse=False)
        print '5'
        print'images nach sort',images
        sorted_images = list()
        print 'sortes_images=',sorted_images
        for row in xrange(ROWS):
            row_list = list()
            for column in xrange(COLUMNS):
                try:
                    row_list.append(ImageTk.PhotoImage(Image.open(os.path.join(IMAGE_PATH,images.pop())).resize(RESIZE_IMAGE_WIDTH,RESIZE_IMAGE_HEIGHT)))
                except IndexError:
                    break
            sorted_images.append(row_list)
            
        return sorted_images
    
if __name__ == '__main__':
    root = tk.Tk()
    #root.update_idletasks()
    root.title(TITLE)
    image_viewer = Image_Viewer(root)
    #image_viewer.pack()
    root.mainloop()
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo wilhelmO !

Code: Alles auswählen

import Tkinter as tk
from PIL import Image, ImageTk
import os
ROW = 3
COLUMN = 4
TITLE = "TK 5 FormenScan"
IMAGE_PATH = "/home/kaytec/Dokumente/images/"
RESIZE_IMAGE_WIDTH = 250
RESIZE_IMAGE_HEIGHT = 130
UPDATE_TIME = 2000


class Image_Viewer(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)
        self.root = root
        self.current_images = self.load_images()
        self.labels = list()
        for row, images in enumerate(self.current_images):
            labels = list()
            for column, (image, file_name) in enumerate(images):
                label = tk.Label(self, image = image)
                label.grid(row = column, column = row)
                labels.append(label)
            self.labels.append(labels)
        
    def load_images(self):
        images = sorted(os.listdir(IMAGE_PATH))
        sorted_images = list()
        for i in xrange(ROW):
            l = list()
            for i in xrange(COLUMN):
                file_name = images.pop()
                l.append((ImageTk.PhotoImage(Image.open("%s%s" %(IMAGE_PATH, 
                    file_name)).resize((RESIZE_IMAGE_WIDTH,
                    RESIZE_IMAGE_HEIGHT))), file_name))
            sorted_images.append(l)
        return sorted_images
        
    def update(self):
        current_images = list()
        self.new_images = self.load_images()
        for cur_imgs, new_imgs, labels in zip(self.current_images, 
            self.new_images, self.labels):
            image_row= list()
            for cur_img, nw_img, label in zip(cur_imgs, new_imgs, labels):
                current_img, current_file_name = cur_img
                new_img, new_file_name = nw_img
                if current_file_name != new_file_name:
                    label.config(image = new_img)
                    image_row.append(nw_img)
                else:
                    image_row.append(cur_img)
            current_images.append(image_row)
        self.current_images = current_images
        self.root.after(UPDATE_TIME, self.update)
    
if __name__ == '__main__':
    root = tk.Tk()
    image_viewer = Image_Viewer(root)
    image_viewer.pack()
    image_viewer.update()
    root.title(TITLE) 
    root.mainloop()
Probiere mal diese Version.

Gruß Frank
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi wilhelmO

In deinem Skript fehlt ein Klammernpaar. Die folgende Zeile:

Code: Alles auswählen

row_list.append(ImageTk.PhotoImage(Image.open(os.path.join(IMAGE_PATH,images.pop())).resize(RESIZE_IMAGE_WIDTH,RESIZE_IMAGE_HEIGHT)))
muss wie folgt aussehen:

Code: Alles auswählen

row_list.append(ImageTk.PhotoImage(Image.open(os.path.join(IMAGE_PATH, images.pop())).resize((RESIZE_IMAGE_WIDTH,RESIZE_IMAGE_HEIGHT))))
Ich würde veruchen die Funktionen weniger tief zu verschachteln. Eventuell in mehrere Zeilen unterteilen.

Gruß wuf :wink:
Take it easy Mates!
wilhelmO
User
Beiträge: 34
Registriert: Mittwoch 17. August 2011, 14:40

Guten Morgen wuf und vielen Dank !!
Programm funktioniert - Fehler war fehlendes Klammerpaar
In meinem Fall war der Fehler vor dem Monitor ( Klammerpaar übersehen ).
Nun habe zwei funktionierende Versionen ( erste von kaytec - nochmals vielen Dank ) , die
sich im Aufbau etwas unterscheiden. Werde bei noch eingehend untersuchen.

:D Allen Beteiligten wünsche ich ein schönes Wochenende und nochmals vielen Dank an
alle ! :D
Antworten