2016-07-03 7 views
0

Wie der Titel sagt, möchte ich Bild von URL anzeigen, ohne Download. Mein Code so weit:Anzeigen von Bildern aus der URL in tkinter

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()“ verursacht Probleme - wenn innerhalb der Schleife, es zeigt nur erstes Bild und nach der Witwe zu schließen, werden einige Fehler geworfen. Und wenn ich es außerhalb der Schleife stelle, zeigt es nur das letzte Bild. Außerdem bin ich mir nicht sicher, ob dies die effizienteste Art ist, Bilder anzuzeigen.

Antwort

2

http://effbot.org/pyfaq/why-do-my-tkinter-images-not-appear.htm bietet eine Erklärung.

Wenn Sie ein Photobild oder ein anderes Image-Objekt zu einem Tkinter-Widget hinzufügen, Sie müssen Ihren eigenen Bezug auf das Bildobjekt halten. Wenn Sie nicht, wird das Bild nicht immer angezeigt.

Das Problem besteht darin, dass die Tkinter/Tk-Schnittstelle die Referenzen auf Image-Objekte nicht richtig behandelt; Das Tk-Widget wird einen Verweis auf das interne Objekt enthalten, Tkinter jedoch nicht.

So wie dies etwas,

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() 
+0

nicht 'von Bild PIL Import Vergessen Sie, ImageTk' und' pip pillow' für Pyhton 3 installieren – CGFoX

Verwandte Themen