如何使用列表中 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()
我相信代码是不言自明的。您必须使用它一段时间才能完全理解并在您的代码中使用它。
我正在 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()
我相信代码是不言自明的。您必须使用它一段时间才能完全理解并在您的代码中使用它。