在 python/Tkinter 中显示来自 URL 的图像

时间:2021-01-08 20:16:55

标签: python tkinter

我正在开发一个天气应用程序并添加一些我正在考虑添加天气地图的香料,因此访问 https://openweathermap.org/api/weathermaps 并获得了包含图像的 URL。我研究了许多在 Tkinter Widget 上显示该图像的方法,但没有一个有效。它显示图像的大小,但不显示图像本身。这是我的代码。非常感谢。

from tkinter import *
from PIL import ImageTk, Image
import requests
import urllib.request
import base64

root = Tk()
root.title("Weather")


link = "https://tile.openweathermap.org/map/pressure_new/0/0/0.png?appid={APIkey}"

class WebImage:
     def __init__(self,url):
          u = urllib.request.urlopen(url)
          raw_data = u.read()
          u.close()
          self.image = PhotoImage(data=base64.encodebytes(raw_data))

     def get(self):
          return self.image

img = WebImage(link_6).get()
imagelab = Label(root, image = img)
imagelab.grid(row = 0, column = 0)

root.mainloop()

2 个答案:

答案 0 :(得分:0)

在这里试试这个:

from tkinter import *
from PIL import ImageTk, Image
import requests
from io import BytesIO


root = Tk()
root.title("Weather")


link = "yourlink/image.jpg"

class WebImage:
     def __init__(self,url):
          u = requests.get(url)
          self.image = ImageTk.PhotoImage(Image.open(BytesIO(u.content)))
          
     def get(self):
          return self.image

img = WebImage(link).get()
imagelab = Label(root, image = img)
imagelab.grid(row = 0, column = 0)

root.mainloop()

答案 1 :(得分:0)

如果链接中的图像是 PNG,您的代码就可以正常工作。可能是链接中的图片是 JPEG,tkinter.PhotoImage 不支持。

您可以使用支持各种图像格式的 Pillow 模块:

import tkinter as tk
import urllib.request
#import base64
import io
from PIL import ImageTk, Image

root = tk.Tk()
root.title("Weather")

link = "https://openweathermap.org/themes/openweathermap/assets/img/logo_white_cropped.png"

class WebImage:
    def __init__(self, url):
        with urllib.request.urlopen(url) as u:
            raw_data = u.read()
        #self.image = tk.PhotoImage(data=base64.encodebytes(raw_data))
        image = Image.open(io.BytesIO(raw_data))
        self.image = ImageTk.PhotoImage(image)

    def get(self):
        return self.image

img = WebImage(link).get()
imagelab = tk.Label(root, image=img)
imagelab.grid(row=0, column=0)

root.mainloop()