如何使用列表中 URL 中的图像供以后在 Tkinter 中使用?

How can use images from URLs in a list for use later on in Tkinter?

我正在 Tkinter 中创建一个 GUI 来查看图像。

此代码有效:

image1 = ImageTk.PhotoImage(Image.open("/path/1.jpeg"))
image2 = ImageTk.PhotoImage(Image.open("/path/2.jpeg"))
images = [image1, image2]

图像不会立即显示在屏幕上,它与我的其余代码一起工作(我可以在其中单击箭头键在数组中的图像之间循环)。

但是,当我尝试使用 URL 而不是当前目录中的路径时,它不起作用并且图像会立即显示。

这是我做的:

class Article:
    def __init__(self, headline, description, link, image_url):
        self.headline = headline
        self.description = description
        self.link = link
        self.cover_image_url = image_url

from urllib.request import urlopen, Request

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.3'}
images = []

articles = [#some list of Article objects]

for article in articles:
    url = article.cover_image_url
    request = Request(url = url, headers = headers) 
    data = urlopen(request).read() 
    images.append(ImageTk.PhotoImage(Image.open(BytesIO(data))))

frame = Label(root, image = images[0])
frame.grid(row = 0, column = 0, columnspan = 3)
status = Label(root, text = "Image Number: 1")

def forward(image_number):
    global frame
    global nextb
    global prev

    frame.grid_forget()
    frame = Label(root, image = images[image_number - 1])
    
    nextb = Button(root, text = ">>", command = (lambda: forward(image_number + 1)))
    prev = Button(root, text = "<<", command = (lambda: backward(image_number - 1)))
    status = Label(root, text = "Image Number: " + str(image_number))

    if image_number == len(images):
        nextb = Button(root, text = ">>", state = DISABLED)

    frame.grid(row = 0, column = 0, columnspan= 3)
    nextb.grid(row = 1, column = 2)
    prev.grid(row = 1, column = 0)
    status.grid(row = 1, column = 1)
  
    return

def backward(image_number):
    global frame
    global nextb
    global prev

    frame.grid_forget()
    frame = Label(root, image = images[image_number - 1])
    
    nextb = Button(root, text = ">>", command = (lambda: forward(image_number + 1)))
    prev = Button(root, text = "<<", command = (lambda: backward(image_number - 1)))
    status = Label(root, text = "Image Number: " + str(image_number))

    if image_number == 1:
        prev = Button(root, text = "<<", command = backward, state = DISABLED)

    frame.grid(row = 0, column = 0, columnspan= 3)
    nextb.grid(row = 1, column = 2)
    prev.grid(row = 1, column = 0)
    status.grid(row = 1, column = 1)

    return 

prev = Button(root, text = "<<", command = backward, state = DISABLED)
prev.grid(row = 1, column = 0)
nextb = Button(root, text = ">>", command = (lambda: forward(2)))
nextb.grid(row = 1, column = 2)
status.grid(row = 1, column = 1)
#close = Button(root, text = "Close", command = root.quit)
#close.grid(row = 1, column = 1)

root.mainloop()

我希望它像第一个示例一样工作,它也向我显示箭头键,我可以循环浏览图像,但它没有这样做。

你可以试试这个:

from tkinter import Tk,Button,Label
from PIL import ImageTk,Image
import io
import requests
import urllib 

root=Tk()

url="<link>"
url1="<link>"
url2="<link>"
url3="<link>"

count=0

urls=[url,url1,url2,url3]
labels=["label 1","label 2","label 3","label 4"]

images=[]
for ur in urls:
    raw_data = urllib.request.urlopen(ur).read()
    im = Image.open(io.BytesIO(raw_data))
    image = ImageTk.PhotoImage(im)
    images.append(image)

def change(direction):
    global count
    if direction=="left":
        if count<=0:
            count=len(urls)-1
        else:
            count-=1
    else:
        if count>=len(urls)-1:
            count=0
        else:
            count+=1
    name.config(text=labels[count])
    l.config(image=images[count])

Label(root).grid(row=1,column=1)
l=Label(root,image=images[count])
l.grid(row=1,column=2)

lb=Button(root,text="Left",command=lambda : change("left"))
lb.grid(row=2,column=1)

name=Label(root,text=labels[count])
name.grid(row=2,column=2)

rb=Button(root,text="Right",command=lambda : change("right"))
rb.grid(row=2,column=3)

root.mainloop()

我相信代码是不言自明的。您必须使用它一段时间才能完全理解并在您的代码中使用它。