Seite 1 von 1

letztes Aktuelles Bild Laden (*Fehler*)

Verfasst: Dienstag 9. April 2019, 15:37
von Sarah92
Hallo, ich bräuchte mal eure Hilfe

Wie kann ich Bilder verzögert in ein Canvas updaten ohne "sleep()".


Ich habe Verzeichnisse in denen bis zu 60 Bilder in der Minute gespeichert weden können es kann aber auch nur 1 pro Stunde sein. Die geschieht aber nicht mit einem von mir erstellten Programm.


Ich möchte jetzt immer nur das Aktuellste angezeigt bekommen. Dazu habe ich volgen Code.

Code: Alles auswählen

def PrintPicture_update(self):

        ts = 0
        found = "Data\Test.jpg"
        for file_name in glob.glob("C:\Test, recursive=True):
            fts = os.path.getmtime(file_name)
            if fts > ts:
                ts = fts
                found = file_name
        	print (found)
        	time_string = datetime.datetime.fromtimestamp(os.stat(found).st_mtime)
        	datum = time_string.strftime("%d.%m.%Y    %H:%M:%S")
        
        	self.PrintPicture_threshold.set(datum)
        
       		baseheight = 70
        	ip = Image.open(found)
        	width, height = 1800, 70
            
        	wpercent = baseheight/height
        	newwidth = width * wpercent
        	newwidth = int(newwidth)
        	newsize = (1800, 70)
        	imnew = ip.resize(newsize, PIL.Image.ANTIALIAS)

        	self.PrintPicture.image = ImageTk.PhotoImage(imnew)
        	self.PrintPicture.itemconfig(self.PrintPicture_image, image = self.PrintPicture.image)

        
        self.restart = self.after(5000, self.PrintPicture_update)
        



an sich würde es funktioinieren doch es kommt immer wieder zu dem Problem, das ich eine "Lese" Fehlermeldung der Datei bekomme!

Ich Denke das es daran liegt die Aktualisierung ungünstig mit dem Schreibvorgang aufeinander trift.

Ich brächte nun Hilfe dabei das ich quasie die letzte Datei Suche... was bisher Funktioniert dann kurz warte und dann erst das Bild geladen wird.

Oder würdet ihr die Sache anders angehen...

Re: letztes Aktuelles Bild Laden (*Fehler*)

Verfasst: Dienstag 9. April 2019, 17:05
von __blackjack__
@Sarah92: Ich würde die Dateinamen nach der Dateizeit sortieren, umgekehrt und dann in einer Schleife so lange die Bilder lesen bis das erste Bild gelesen werden kann. Das dürfte wenn Deine Vermutung zutrifft dann ja in der Regel das zweite Bild sein. Oder Du suchst das neueste (`max()`) und ignorierst das Fehlschlagen des Lesens.

`time_string` ist der falsche Name für etwas das gar keine Zeichenkette ist. `ts` und `fts` sind kryptische Abkürzungen. Namen schreibt man in Python klein_mit_unterstrichen. Ausnahmen: Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Re: letztes Aktuelles Bild Laden (*Fehler*)

Verfasst: Dienstag 9. April 2019, 17:11
von Sarah92
@__blackjack__

Danke für die Tip´s, wie kann ich denn das Fehlschlagen des Lesens Ignorieren?

Re: letztes Aktuelles Bild Laden (*Fehler*)

Verfasst: Dienstag 9. April 2019, 17:19
von __blackjack__
@Sarah92: Die Ausnahme entsprechend behandeln.

Re: letztes Aktuelles Bild Laden (*Fehler*)

Verfasst: Dienstag 9. April 2019, 18:38
von Sarah92
könntest du mir da etwas Hilfestellung geben?

habe jetzt erst mal so umgebaut

Code: Alles auswählen

def PrintPicture_update(self):

        list_of_files = glob.glob(C:\Test\*.jpg)
        if len(list_of_files) == 0:
           print ("kein Bild")
           found = "Data\Test.jpg"
             

        else:
                print ("ein Bild")
                latest_file = max(list_of_files, key=os.path.getctime)
                found = latest_file
                print (found)
                time_string = datetime.datetime.fromtimestamp(os.stat(found).st_mtime)
                datum = time_string.strftime("%d.%m.%Y    %H:%M:%S")
                self.Signierungsfehler_threshold.set(datum)
         
            
        
        baseheight = 70
        ip = Image.open(found)
        width, height = 1800, 70
            
        wpercent = baseheight/height
        newwidth = width * wpercent
        newwidth = int(newwidth)
        newsize = (1800, 70)
        imnew = ip.resize(newsize, PIL.Image.ANTIALIAS)

        self.PrintPicture.image = ImageTk.PhotoImage(imnew)
        self.PrintPicture.itemconfig(self.PrintPicture_image, image = self.PrintPicture.image)

        
        self.restart = self.after(5000, self.PrintPicture_update)
.


aber weis noch nicht weiter, wie ich den Fehler beim laden Ignoriere und die Funktion dann nicht beendet wird.

Re: letztes Aktuelles Bild Laden (*Fehler*)

Verfasst: Dienstag 9. April 2019, 18:49
von Sarah92
so versucht selber noch mal zu probieren, könnte das der richtige weg sein

Code: Alles auswählen

 def PrintPicture_update(self):

        list_of_files = glob.glob(C:\Test\*.jpg)
        if len(list_of_files) == 0:
           print ("kein Bild")
           found = "Data\Test.jpg"
             

        else:
                print ("ein Bild")
                latest_file = max(list_of_files, key=os.path.getctime)
                found = latest_file
                print (found)
                time_string = datetime.datetime.fromtimestamp(os.stat(found).st_mtime)
                datum = time_string.strftime("%d.%m.%Y    %H:%M:%S")
                self.Signierungsfehler_threshold.set(datum)
                try:
                    myfile = open(found, "r+")
                    baseheight = 70
                    ip = Image.open(found)
                    width, height = 1800, 70
                        
                    wpercent = baseheight/height
                    newwidth = width * wpercent
                    newwidth = int(newwidth)
                    newsize = (1800, 70)
                    imnew = ip.resize(newsize, PIL.Image.ANTIALIAS)

                    self.PrintPicture.image = ImageTk.PhotoImage(imnew)
                    self.PrintPicture.itemconfig(self.PrintPicture_image, image = self.PrintPicture.image)
                    self.restart = self.after(5000, self.PrintPicture_update)

                  
                except IOError:
                    print ("starte neu")
                    self.restart = self.after(5000, self.PrintPicture_update)
leider kann ich den Fehler nicht reproduzieren deshalb kann ich es nicht testen

Re: letztes Aktuelles Bild Laden (*Fehler*)

Verfasst: Dienstag 9. April 2019, 19:05
von __deets__
Die dopplung des after Aufrufs ist unnötig, den kannst du einmal hinter den try/except block schreiben. Und das try except hat viel zu viele Zeilen. Das sollte nur den Teil umfassen, der wirklich das Problem verursacht.

Code: Alles auswählen

try:
     bild = ...
except IOError: 
      pass
else: 
     machwasmit(bild)
after()

Re: letztes Aktuelles Bild Laden (*Fehler*)

Verfasst: Dienstag 9. April 2019, 19:27
von Sirius3
@Sarah92: alle Deine Code-Beispiele enthalten Schreibfehler. Der Compiler ist da ziemlich pingelig, ich als Leser muß mich auch immer fragen, ist das jetzt nur ein Flüchtigkeitsfehler oder ist der Code wirklich falsch. Zum Programmieren gehört Sorgfältigkeit. Dazu zählt auch dass man immer mit 4 Leerzeichen pro Eben einrückt, nicht mal 3, 5 oder 8. Variablen, Methoden und Funktionen schreibt man klein_mit_unterstrich, nur Klassen werden in CamelCase geschrieben.

Warum nennst Du `latest_file` mal `latest_file` und mal `found`?
time_string ist immer noch kein String und myfile wird zwar geöffnet, aber weder benutzt noch wieder geschlossen. Wenn Du prüfen willst, ob die Datei existiert, kann man auch mit os.path.isfile arbeiten, oder den Fehler beim Image.open abfangen, dazu muß man die Datei aber nicht nochmal extra öffnen.