Photo aus dem Netz in Canvas darstellen

Fragen zu Tkinter.
Antworten
rick
User
Beiträge: 2
Registriert: Mittwoch 27. September 2017, 09:14

ich bin komplett neu in Python (aber mit Erfahrung in Perl, etc.) und arbeite mit Linux/Xubuntu.

Ich möchte eine bestehende Anwendung (pycocuma) dahingehend erweitern, dass sie Photos aus dem Internet anzeigen kann. Das Photoformat ist JPG, Die Anwendung ist für python2.7.

Die Originalroutine sieht so aus:

Code: Alles auswählen

def renderPhoto(self, imagedata, x, y):
    "draw photographic picture"
    msg = ""
    photoimage = None
    try:
        try:
            import ImageTk
        except:
            msg = "renderPhoto(): Could not import ImageTK - \n"
            msg += " You must install PIL (Python Imaging Library).\n"
        import base64
        photoimage = ImageTk.PhotoImage(data=base64.decodestring(imagedata))
        self.canvas_items.append(self.canvas.create_image(x, y, anchor=NE, image=photoimage))
    except:
        msg += "renderPhoto(): Could not render PhotoImage."
        broadcaster.Broadcast('Notification', 'Error', {'message':msg})
    return photoimage
Die URL des Photos kommt in "imagedata", z.B. "//www.xing.com/img/users/e/2/3/7236e5780. ... 40x185.jpg". Das Programm erwartet normalerweise das Bild lokal gespeichert.

Meine Absicht ist, einige Logik zur Unterscheidung, ob Web oder lokales Bild einzubauen und dann ... ich weiß nicht, wie ich mittleren Teil gestalten soll, um die URL abzuholen und das Photo zur Anzeige zu bringen.

Danke für die Hilfe,
Rick.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Willst du das nur irgendwie hacken? Oder soll es so gut sein, dass es auch wieder upstream akzeptiert wird?
rick
User
Beiträge: 2
Registriert: Mittwoch 27. September 2017, 09:14

Letzteres wäre schon schön. Das Programm ist Version 0.4.5-6 und der Autor sagt, er pflegt es nicht mehr. Allerdings ist dieses Programm das einzige, das meine Anforderungen erfüllt (d.h. es funktioniert im wesentlichen). Möglicherweise sind andere auch an diesem Feature interessiert. Notfalls auch eine Q&D-Lösung.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was mich noch verwirrt: du schreibst imagedata ist eine URL. Es ist aber laut Code base64-encodiert schon das eigentliche Bild. Heisst das nicht, dass man da woanders ansetzen muss?

Was du so oder so schon mal bauen kannst: eine Funktion, die eine URL entgegennimmt, und

- ein cache-verzeichnis erstellt, wenn es noch nicht existiert
- die URL hasht (md5 oder so reicht voellig) und prueft, ob schon ein gecachtes Bild da ist
- wenn nicht, mittels urllib das Bild runterlaedt, und unter dem hash als Dateinamen im cache ablegt
- die Bilddaten bzw. den Pfad darauf (siehe Frage oben) zurueckgibt.

Diese Funktion kannst du schoen als eigenes Skript bauen & testen, bis sie funktioniert. Und dann baust du die nur noch ein.

Das ist dann allerdings Q&D, weil es bei nicht-vorhandensein die GUI blockiert bis das Bild da ist. Wenn man das richtig machen will, wird es komplizierter.
Antworten