Photos aus dem Internet lassen sich in tkinter-Label nicht anzeigen

  • Hallo,


    ich wollte gerne mit tkinter ein kleines Programm schreiben, dass aus einer API sich Bilder holt (ist eine API für Hundebilder) und das Bild dann in einem Label darstellt. Die Bilder liegen im .jpg-Format vor. Ich habe im Internet gegoogeled und die Funktion, die diese Bilder aus dem Internet anzeigen soll, nach dieser Anleitung geschrieben. Leider wird im Label aber nichts angezeigt.

    Nun weiß ich als Programmieranfänger allerdings nicht, ob das an der API liegt (glaube ich eher nicht, weil wenn ich die urls in den Browser einfüge, kommt auch ein Bild) oder am Code.

    Vielleicht kann mal jemand drüberschauen und mir sagen, was ich verkehrt mache. Ich komme beim besten Willen nicht drauf.


    Vielen Dank und viele Grüße!


  • Go to Best Answer
  • Nein, nur die betreffende Funktion. Hier mal der komplette code:


  • Hallo,


    nur mal von der Idee her würde es wie folgt funktionieren. Ich habe keine Ahnung wie weit du Python beherrscht und wo du überall Hilfe brauchst oder ob mein Beispiel schon reicht, deswegen habe ich mir erst mal nicht all zu große Mühe gegeben. Wie schon geschrieben, wäre der ganze Code sehr hilfreich mit Fehlermeldung, falls vorhanden.



    Aus diesem Beispiel sollst du, wenn überhaupt, die Funktionalität übernehmen. Wenn du ein GUI schreibst, wirst du schnell eine Klasse benötigen. Das heißt du musst objektorientierte Programmierung drauf haben. Was der Code nicht kann, ist die Änderung der Bilder, ich will dir nicht den Spass und die Freude nehmen, wenn man sich selbst etwas erarbeitet.


    Grüße

    Dennis


    Edit: Da haben sich unsere Beiträge überschnitten. Ich schau mir deinen Code später genauers an.

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

  • Ok, danke dafür schonmal. Ja, da haben wir uns überschnitten - mir ist schon im Klaren, dass es in der GUI-Programmierung ohne OOP nicht geht. Der Code soll die Bilder nicht automatisch ändern, sondern nur eben auf Buttondruck das jeweils aktuelle Bild anzeigen lassen.


    P.S. Danke, dass du den Code später mal durchschaust :)

  • P.S.


    Habe deinen Code gerade ausprobiert. Gleiches Problem wie bei meinem: Label zeigt einfach nichts an:


  • Quelle: https://www.daniweb.com/progra…mage-from-the-web-tkinter


    Bleibt nur noch die Random URL einzubinden.


    EDIT: und natürlich den Code zu funktionalisieren, sodass am Ende das ganze Zeugs nicht auf globaler Ebene steht ;)

  • Hallo,


    danke für deine Antwort. Nach genau der Anleitung, die du gepostet hast, habe ich das auch gestaltet.


    Funktionalisiert müsste das Ganze doch sein, oder meinst du da was anderes? In meinem Code habe ich schonmal aus dem Grund eine Funktion geschrieben, weil das Ganze ja jeweils nach Buttonklick erst das Bild anzeigen soll, dass die API "ausspuckt".

  • Hallo,


    sorry, habe deinen Code gestern Abend zwar noch gesehen, aber das Bett hatte mich dann doch schneller als erwartet angezogen.

    Du kannst meinen Code nicht irgendwie in deine Klasse integrieren.

    'random wird bei dir importiert aber nicht genutzt, ebenso wie 'time', 'datetime' und 'messagebox'. Das kann also alles weg.

    In 'init' wird die Klasse beschrieben, 'root=tk.TK()' gehöhrt in die 'main' Funktion, dies ist die Hauptfunktion und steuert das Programm. Die Klasse bekommt was sie benötigt dann beim Aufruf übergeben.

    'api' ist für einen Funktionsnamen etwas schlecht gewählt, Funktionsnamen sollen beschrieben was die Funktion macht.

    Konstanten gehören nicht in eine Funktion, sondern auf Modulebene. Konstanten erkennst du daran, das sie GANZ_GROSS geschrieben werden.

    Du hast in deiner 'init' gar kein Label definiert, von dem du das Bild durch einen Button klick ändern willst. Und zum Schluss, das was du als 'Hauptprogramm' kommentierst ist nicht das Hauptprogramm. Das ist lediglich eine 'if'-Abfrage die deine Hauptfunktion aufruft oder nicht.


    Ich benutze 'canvas' für die Anzeige des Bildes. Ob die Bilder in der richtigen größe dargestellt werden habe ich nicht überprüft:


    Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

  • So funktioniert es ! :)


    Weißt du, wo genau mein Fehler lag? Dass einige Module importiert werden, die (noch) nicht benötigt werden, dürften ja an der Funktionalität des Programms nichts ändern.


    Ich tippe mal, dass ich die Erstellung des root-Fensters nicht in die main-Funktion gepackt habe.


    Wenn ich deinen Code richtig lese, packst du in dem "eigentlichen Programm" den Button und das Label (ja das habe ich vergessen zu definieren, aber habe es auch mit Definition des Labels nicht hinbekommen) nochmal in einen frame. Könnte man das auch ohne machen, also dass alles direkt auf "root" liegt?


    Und was bedeutet das "master" im Konstruktor? self ist logisch hingegen...


    Sorry für die vielen Fragen, aber ich möchte gerne kapieren, was mir gezeigt wird :)

    • Best Answer

    Hallo,



    Ja der Fehler lag nicht an den Importen, das ist mir nur so aufgefallen.

    Dein Programm funktioniert mit einer kleinen Änderung auch:

    Code
            self.dog_picture = ImageTk.PhotoImage(picture)
            self.anzeige = tk.Label(self.root, image = self.dog_picture)


    Das Problem ist (ich hoffe ich habe das noch richtig im Kopf) du musst dein Bild "speichern". Das geschieht wenn du es an 'self' bindest. Wenn du das nicht machst, dann weis 'tkinter' nicht mehr was 'dog_picture' sein soll. Dazu gab es mal eine Diskussion die sich auf das Problem hier meiner Meinung nach übertragen lässt:

    https://www.python-forum.de/viewtopic.php?f=18&t=51458


    'master' wird verwendet um das übergeordnete Fenster anzugeben. Da muss ich ehrlich sein, dass ich das auch nur bedingt verstanden habe und bevor ich hier Halb-Wissen veröffentliche, wäre es mir lieber wenn jemand erklärt der das voll verstanden hat.



    Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?