Probleme mit webview beim Laden neuer Bilder

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
paeppi_79
User
Beiträge: 27
Registriert: Montag 13. Juli 2009, 19:33

Hallo,

ich hoffe es kann mir jemand aus dem Forum helfen. Ich versuche wieder einmal mein Projekt zu ändern.

Ich nutze das webview um mir mir Berichte anzeigen zu lassen welche ich vorher in einem html code generiert habe.
Nun habe ich folgendes Problem dass ich mir zu einem Breicht jeweils einen QR Code erstelle und diesen mit Anzeigen lassen möchte.
Das ganze funktioniert auch nach dem Start des Programms, leider bei einer weiteren Anzeige des Berichtes mit neuen Daten scheint QT und webview das Bild aus dem Cache zu holen und nicht neu zu laden.

Folgende Funktion zeigt den Bericht an:

Hauptprogramm:

Code: Alles auswählen

if self.AuswahlBerichte=='Datenblatt Target B':
            result=Berichte.Auswahl_Berichte_Targetlager_T2()
            self.webView.setHtml(result)
Berichte:

Code: Alles auswählen

def Auswahl_Berichte_Targetlager_T2():
              "<img src=M:/mein programm/qr.png border=0 width=160 height=160>"
Funktioniert nur beim ersten Mal, danach wird immer das gleiche Bild angezeigt. Auch mit folgenden Einträgen im Body ändert sich nichts.

Code: Alles auswählen

         "<html>"
             "<head>"
                "<meta http-equiv=expires content=0>"
                "<meta http-equiv=cache-control content=no-cache>"
                "<META http-equiv=pragma content=no-cache>"
             "</head>"
Rufe ich das Bild mit einem Link auf erscheint dann das aktuelle Bild auf einer neuen Seite und nicht in meiner vorher erzeugten Bericht(Tabelle).

Code: Alles auswählen

             "<a href=M:/mein programm/qr.png>Bild vom QR-Code</a>"
Wie kann ich das webview modul dazu bringen, dass wenn ich die html seite neu lade auch das Bild neu geladen wird. Das Bild(QR-Code) hat immer den selben Dateinamen.

Für Vorschläge bin ich dankbar.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Mach mal ein minimales Beispiel oder zeig was komplettes sonst wird da keiner was sagen können.

PS: Fehlt bei Auswahl_Berichte_Targetlager_T2 nicht irgend wie ne Zuweisung oder ein return?
paeppi_79
User
Beiträge: 27
Registriert: Montag 13. Juli 2009, 19:33

Hallo SR4I,

Vielen Dank für die Antwort,anbei mal das Beispiel. Sicher fehte die Returnzuweisung, es war ja nicht komplett.
Muss ich ggf. beim QR Bild die Datei jedes mal umbenennen? Da hätte ich aber eine Menge unnötiger Bilder .

Code: Alles auswählen

import os, signal, subprocess
import sys
import time
import datetime
import pyqrcode

def Auswahl_Berichte_Targetlager_T1():
            
            print "Targetlager"
            
            f = file('sys/Transfer.pe','r+')

            daten = f.readlines()
            print daten
            
            Kathode=daten[1]
            Material=daten[2]
            Kompartment=daten[4]
            Datum=daten[5]
            TargetnummerT1=daten[7]
            T1_MATERIAL=daten[47]
            HerstellerT1=daten[8]
            KWhT1=daten[9]
            dSWS1=daten[10]
            WS1=daten[11]
            M1=daten[12]
            BS1=daten[13]
            dSBS1=daten[14]
            
            inhalt_qr='0815'+','+Material+','+TargetnummerT1
            
            code = pyqrcode.create(inhalt_qr)
            #code.png('qr.png', scale=5)
            code.png('qr.png', scale=5,
                     #module_color=(0x66, 0x33, 0x0),      #Dark brown
                     background=(0xff, 0xff, 0xff, 0x88)) #50% transparent white            
            
            datenblatt_Targetlager=(
             #"<html><head><title> Datenblatt Kathode </title></head>"
            "<html>"
             "<head>"
              "<meta http-equiv=expires content=0>"
              "<meta http-equiv=cache-control content=no-cache>"
              "<META http-equiv=pragma content=no-cache>"
             "</head>"
             "<table width=100% border=0 bordercolor=#000000 cellpadding=20 cellspacing=4>"
             " <tr>"
             "  <th width=1929 scope=col><align=center><img src=M:/mein programm/logo.png alt=saint-gobain border=0 width=160 height=100></th>"
             " </tr>"
             "</table>"
             
             "<body text=#000000 bgcolor=#FFFFFF link=#FF0000 alink=#FF0000 vlink=#FF0000>"
              "<h1>GEBRAUCHT</h1><p></p>"
              "<table width=100% border=2 cellpadding=0 cellspacing=2 rules=cols>"
              "</table><p></p>"
             
              "<table width=100% border=2 cellpadding=1 cellspacing=1 rules=none>"
              "<tr>"
                "<th scope=row><u>Ausbaudatum:</u></th>"
                "<td>"+Datum+"</td>"
                "<th>duenste Stelle PS:</th>"
                "<td>"+dSWS1+"</td>"
                "<td></td>"
                "<td></td>"
                "<td></td>"
                "<td></td>"
                "<td></td>"
                "<td></td>"
              "</tr>"
              "<tr>"
               "<th scope=row><u>Material:</u></th>"
               "<td><h2>"+T1_MATERIAL+"</h2></td>"
               "<th>Pumpenseite:</th>"
               "<td>"+WS1+"</td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
              "</tr>"
              "<tr>"
               "<th scope=row><u>Target-Nr:</u></th>"
               "<td><h2>"+TargetnummerT1+"</h2></td>"
               "<th>Mitte:</th>"
               "<td>"+M1+"</td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
              "</tr>"
              "<tr>"
               "<th scope=row><u>kWh bisher:</u></th>"
               "<td><h2>"+KWhT1+"</h2</td>"
               "<th>Steuerseite:</th>"
               "<td>"+BS1+"</td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
              "</tr>"
              "<tr>"
               "<th scope=row><u>Aus Kathode:</u></th>"
               "<td>"+Kathode+"</td>"
               "<th>duenste Stelle SS:</th>"
               "<td>"+dSBS1+"</td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
              "</tr>"
              "</table><p></p>"
             
              "<table width=100% border=2 bordercolor=#000000 cellpadding=30 cellspacing=4 rules=none>"
             #"<a href=M:/108_Magnetron_2/03_Technik_Technologie/01_Wartung/07_Wartungssoftware/cms/qr.png>Bild vom QR-Code</a>"
              "<tr>"
               "<th width=1929 scope=col><align=center><a href=M:/mein programm/qr.png>Bild vom QR-Code</a></th>"
              "</tr>"
              #"<tr>"
               " <th width=1929 scope=col><align=center><img src=M:/mein programm/qr.png border=0 width=160 height=160></th>"
              #"</tr>"
              "</table><p></p>"
              "<table width=100% border=2 cellpadding=0 cellspacing=2 rules=cols>"
              "</table><p></p>"
              "<table width=100% border=2 cellpadding=0 cellspacing=2 rules=cols>"
              "</table><p></p>"
              "<table width=100% border=2 cellpadding=1 cellspacing=1 rules=none>"
              "<tr>"
               "<th scope=row><h2>Eingebaut in Kathode:</h2></th>"
               "<td>"               "</td>"
               "<th><h2>Eingebaut am:</h2></th>"
               "<td>"               "</td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
               "<td></td>"
              "</tr>"
              "</table><p></p>"
             "</body>"
             "</html>")
            return datenblatt_Targetlager
Zuletzt geändert von Anonymous am Donnerstag 11. Mai 2017, 09:00, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@paeppi_79: Das reicht nicht um das Problem nachzustellen. Ein minimales Beispiel muss auch nichts von Deinen Berichtsdaten ausser dem QR-Code enthalten und auch nichts weiter von der GUI ausser das was nötig ist um das Problem mit dem Neusetzen des Inhalts zu demonstrieren.

Anmerkungen zum Code: Die Datei mit den Daten wird geöffnet, aber nicht wieder geschlossen. Zudem macht der Modus 'r+' hier keinen Sinn, und eigentlich bei Textdateien allgemein nicht. Eigentlich nur wenn man Textdateien hat mit einer festen Datensatzgrösse, was in Zeiten von Kodierungen die eine variable Anzahl von Bytes pro Zeichen haben können, immer unwahrscheinlicher wird, dass man so etwas haben möchte. Wenn im Modus ein '+' ist, dann nur bei Binärdateien wo `seek()` verwendet wird, oder mindestens vorhandene Daten überschrieben werden. Ansonsten hat das '+' da nichts zu suchen.

So viel HTML schreibt man üblicherweise in eine eigene Datei und verwendet ein Template-System um da Werte hinein zu formatieren. Die lösen dann in der Regel auch gleich Probleme mit Werten wie einem Hersteller der 'Hinz & Kunz' heisst, oder wo andere Zeichen vorkommen die in HTML eine besondere Bedeutung haben.

Das HTML ist an einigen Stellen nicht gültig. Also eigentlich bei allen Attributen, denn da fehlen Anführungszeichen um die Werte. Was besonders bei Werten mit Leerzeichen in den Werten auch bei sehr nachsichtigen Browsern zu Problemen führen kann.

Der Kommentar zur Hintergrundfarbe des QR-Codes stimmt nicht, das sind 53,125% und nicht 50%. :-)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du kannst mE zwei Strategien fahren:

- versuchen, das caching-System zu beeinflussen. Es gibt dazu ein paar Einstellungen in den settings des WebViews, aber ob das wirklich funktioniert steht etwas in den Sternen.
- eindeutigkeit bei den URLs erzeugen. Dazu kann entweder ein eindeutiger Name hergenommen werden (was ich bei dem QR-code auch nicht so ungewoehnlich finde), oder man haengt Zufallswerte an die URL, die dann aber natuerlich ignoriert werden muessen. Das geht bei einem richtigen server einfach. Bei einer Datei schon eher nicht so, du kannst mal ausprobieren, ob ein achor (datei.png#zufallszahl) klappt. Aber da bin ich skeptisch.

Wenn du mehrere QR-code-bilder erzeugen musst, dann ist das halt so & du musst die nicht mehr benoetigten eben aufraeumen. Das kostet jetzt auch nur 2 Minuten zu programmieren.
paeppi_79
User
Beiträge: 27
Registriert: Montag 13. Juli 2009, 19:33

Hallo BlackJack,

vielen Dank für deinen Kommentar, ich habe tatsächlich vergessen die Datei wieder zu schließen-hab ich eingepflegt. Prinipiell steht der HTML Code in einer seperaten Datei "Berichte", über das lesend er Datei wird der HTML gefüttert. Die Anführungszeichen bei den Attributen hatte ich gesetzt wie üblich im HTML. Leider funktioniert dies nicht im WebView, dort muss scheinbar die gesamte Zeile mit Anführungszeichen gesetzt werden.

@ __deets__,

ich habe es nicht geschafft das catching system anzupassen, die Erzeugung der QR codes mit einem eindeutigen Namen (ich habe den Zeitstempel benutzt) würde funktionieren. Gibt es eine einfache Möglichkeit vor Benutzung die QR-Bilder automatisch zu löschen? Etwa suchen nach Dateinamen mit Beginn QR_Code und löschen dieser?

MFG
paeppi_79
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja natürlich. Das os Modul ist dein Freund. Und das glob Modul.
Antworten