letztes Aktuelles Bild Laden (*Fehler*)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Sarah92
User
Beiträge: 4
Registriert: Dienstag 9. April 2019, 14:37

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...
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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).
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Sarah92
User
Beiträge: 4
Registriert: Dienstag 9. April 2019, 14:37

@__blackjack__

Danke für die Tip´s, wie kann ich denn das Fehlschlagen des Lesens Ignorieren?
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sarah92: Die Ausnahme entsprechend behandeln.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Sarah92
User
Beiträge: 4
Registriert: Dienstag 9. April 2019, 14:37

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.
Sarah92
User
Beiträge: 4
Registriert: Dienstag 9. April 2019, 14:37

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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()
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Antworten