如何使用 Python 在单个 Tkinter canvas 中显示来自多个 url 的多个图像

How to display multiple Images from from multiple urls in a single Tkinter canvas using Python

我有一个 url 的列表,每个 url 只包含一张图片,我想使用 [=22] 在一个 tkinter canvas 上显示所有图片=] 列表还包含一些不包含图像的 url tkinter 应该忽略那些 url.

我创建了一次只显示一张图像的代码。

import io
import base64
try:
    # Python2
    import Tkinter as tk
    from urllib2 import urlopen
except ImportError:
    # Python3
    import tkinter as tk
    from urllib.request import urlopen
root = tk.Tk()
root.title("display a website image")

w = 800
h = 600
x = 200
y = 300

root.geometry("%dx%d+%d+%d" % (w, h, x, y))


image_url = "http://www.okclipart.com/img2/yrdulrdklckodbfcqsuy.png"
image_byt = urlopen(image_url).read()
image_b64 = base64.encodestring(image_byt)
photo = tk.PhotoImage(data=image_b64)

cv = tk.Canvas(bg='white')
cv.pack(side='top', fill='both', expand='yes')
cv.create_image(10, 10, image=photo, anchor='nw')
root.mainloop()

图像示例列表 url

urllist =['https://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/NoCopyright.png/600px-NoCopyright.png','http://www.okclipart.com/img16/kjlhjznjvkokwqpalupl.png'
,'http://www.okclipart.com/img16/qcmwejvtwuufltxsibbn.png',
'http://www.okclipart.com/img2/yrdulrdklckodbfcqsuy.png']

列表中还有一些 url 不包含任何图像,因此应忽略那些 url。

  1. 忽略无效 urltry ... except urllib2.HTTPError 将帮助您解决这个问题
  2. 加载多张图片:遍历 urllist 并加载每张图片。成功后把它画到你身上canvas.
#from urllib.request import HTTPError #py3
#from urllib2 import HTTPError #py2
#... 
def load_image_to_base64(image_url):
    """ Load an image from a web url and return its data base64 encoded"""
    image_byt = urlopen(image_url).read()
    image_b64 = base64.encodestring(image_byt)
    return image_b64

# load photos to photos list
urllist = ['http://www.okclipart.com/img16/kjlhjznjvkokwqpalupl.png', 
           'invalidurltest', 
           'http://www.okclipart.com/YouWontFindThisImage.png']
photos = []
for i, url in enumerate(urllist):
    print(i,"loading",url)
    try:
        photo = tk.PhotoImage(data=load_image_to_base64(url))
        photos.append(photo)
        print("done")
    except HTTPError as err:
        print("image not found, http error code:", err.code)
    except ValueError:
        print("invalid url", url)

# iterate through photos and put them onto the canvas
for photo in photos:
    cv.create_image(10*i, 10*i, image=photo, anchor='nw')

root.mainloop()
#...