在tkinter中显示来自url的图像[重复]

Posted

技术标签:

【中文标题】在tkinter中显示来自url的图像[重复]【英文标题】:Displaying images from url in tkinter [duplicate] 【发布时间】:2016-11-05 12:36:30 【问题描述】:

正如标题所说,我想显示来自 url 的图像,而不是下载。到目前为止我的代码:

from bs4 import BeautifulSoup as soup
from tkinter import *
import urllib.parse
from PIL import Image, ImageTk
import io

website = "http://www.porcys.com/review/"
openWebsite = soup(urllib.request.urlopen(website), 'html.parser')

reviews = openWebsite.find(name="section", attrs='class': 'slider-content review').ul

results = []
for a in reviews(href=True):
    temp = "http://www.porcys.com"+a['href']
    results.append(temp)

mainWindow = Tk()
mainWindow.title("Latest Porcys reviews")

for i in range(0, 8):
    review = results[i]
    openReview = soup(urllib.request.urlopen(review), 'html.parser')
    rating = openReview.find(name="span", attrs='class': 'rating')
    album = openReview.find(name="div", attrs='class': 'wrapper').i
    artist = openReview.find(name="div", attrs='class': 'wrapper').h2
    coverWIP = openReview.find(name="img", attrs='class': 'cover')
    for tag in openReview.find_all('i'):
        tag.replaceWith(' ')
    print(artist.text)
    print(album.text)
    print(rating.text)
    cover = "http://www.porcys.com"+coverWIP['src']
    print(cover)
    artistAndAlbum = Label(font=("Helvetica",10), text=artist.text+'- '+album.text)
    artistAndAlbum.grid(row=i, column=100, sticky=W)
    ratingGUI = Label(font=("Helvetica",10), text=rating.text)
    ratingGUI.grid(row=i+1,columnspan=100)
    raw_data = urllib.request.urlopen(cover).read()
    im = Image.open(io.BytesIO(raw_data))
    image = ImageTk.PhotoImage(im)
    label1 = Label(mainWindow, image=image)
    label1.grid(row=i, sticky=W)
    mainWindow.mainloop()

"mainWindow.mainloop()" 引起了麻烦 - 在循环内时,它只显示第一张图像,在关闭寡妇后,会引发一些错误。当我把它放在循环之外时,它只显示最后一张图片。另外,我不确定这是否是显示图像的最有效方式。

【问题讨论】:

【参考方案1】:

http://effbot.org/pyfaq/why-do-my-tkinter-images-not-appear.htm 提供解释。

当您将 PhotoImage 或其他 Image 对象添加到 Tkinter 小部件时, 您必须保留自己对图像对象的引用。如果你不这样做, 图片不会一直显示。

问题是 Tkinter/Tk 接口不处理引用 正确地对对象进行成像; Tk 小部件将包含对 内部对象,但 Tkinter 没有。

像这样,

images = []

for i in range(0, 8):
    ...
    raw_data = urllib.request.urlopen(cover).read()
    im = Image.open(io.BytesIO(raw_data))
    image = ImageTk.PhotoImage(im)
    label1 = Label(mainWindow, image=image)
    label1.grid(row=i, sticky=W)

    # append to list in order to keep the reference
    images.append(image)
mainWindow.mainloop()

【讨论】:

不要忘记 Pyhton 3 的 from PIL import Image, ImageTkpip install pillow W 应该是 'w' 吗? @Eli 常量tkinter.W 定义为'w';使用tkinter 模块中定义的那些常量可能被认为是更好的编码风格

以上是关于在tkinter中显示来自url的图像[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Tkinter 在 GIF 中播放动画 [重复]

Tkinter消失PhotoImage问题[重复]

在图像框架上叠加tkinter小部件

我无法在我的 tkinter 图像上显示文本

在 tkinter 画布中显示图像

Tkinter 在 Mac 上的 Tk() 上不断崩溃