Python Tkinter如何实时显示图像?

时间:2019-04-05 15:27:15

标签: tkinter python-3.6

当我尝试从光盘上显示图像而不从互联网上下载图像时,一切正常,并且图像显示正确。但是,当我尝试从我的网站下载图像时,将其扩展名更改为.gif以便与PIL库一起使用,并在单击按钮后显示它,则什么也没有显示。我确定subprocess.call中的所有操作均正确执行。我该如何运作?

from tkinter import *
from PIL import ImageTk, Image

root = Tk()
root.title("My app")
root.geometry("680x500+0+0")

def callback(event):
    subprocess.call("wget example.com/pic.png && mv pic.png pic.gif", shell = True)
    img = ImageTk.PhotoImage(Image.open("pic.gif"))
    la.configure(image = img)

b1 = Button(root, text = "b1", bg = "red")
b1.grid(row = 0, column = 0)

b2 = Button(root, text = "b2", bg = "blue")
b2.grid(row = 0, column = 1)

la = Label(root, text="hi")
la.grid(row = 1, column = 0)

b2.bind("<Button-1>", callback)

root.mainloop()

1 个答案:

答案 0 :(得分:0)

首先:您无法将扩展名.png更改为.gif以获取GIF文件。您将不得不使用一些程序来进行转换。但是Image.open可以使用PNG文件,因此您不必转换它。

 img = ImageTk.PhotoImage(Image.open("furas.png"))

第二步:PhotoImage中存在一个错误,该错误在将图像分配给函数中的局部变量时将其从内存中删除。因此,您必须将其分配给全局变量。常见的方法是将其分配给将显示它的标签。您可以使用任何名称作为变量-即。 .image

 la.image = img

更多文档:effbot.org上的PhotoImage

第三步:您是否在终端中运行代码以查看错误消息?您忘记导入subprocess

包含现有图片的完整代码

from tkinter import *
from PIL import ImageTk, Image
import subprocess

def callback(event):
    subprocess.call("wget https://blog.furas.pl/theme/images/me/furas.png", shell=True)
    img = ImageTk.PhotoImage(Image.open("furas.png"))
    la.configure(image=img)
    la.image = img

root = Tk()
root.title("My app")
root.geometry("680x500+0+0")

b1 = Button(root, text="b1", bg="red")
b1.grid(row=0, column=0)

b2 = Button(root, text="b2", bg="blue")
b2.grid(row=0, column=1)

la = Label(root, text="hi")
la.grid(row=1, column=0)

b2.bind("<Button-1>", callback)

root.mainloop()

顺便说一句::您可以使用Button(..., command=callback),但可以从event中删除def callback()

from tkinter import *
from PIL import ImageTk, Image
import subprocess

def callback():
    subprocess.call("wget https://blog.furas.pl/theme/images/me/furas.png", shell=True)
    img = ImageTk.PhotoImage(Image.open("furas.png"))
    la.configure(image=img)
    la.image = img

root = Tk()
root.title("My app")
root.geometry("680x500+0+0")

b1 = Button(root, text="b1", bg="red")
b1.grid(row=0, column=0)

b2 = Button(root, text="b2", bg="blue", command=callback)
b2.grid(row=0, column=1)

la = Label(root, text="hi")
la.grid(row=1, column=0)

root.mainloop()

编辑:,您可以使用Python的标准模块wget和函数urllib来代替urllib.request.urlretrive()

from tkinter import *
from PIL import ImageTk, Image
import urllib.request

def callback():
    urllib.request.urlretrieve("https://blog.furas.pl/theme/images/me/furas.png", "furas.png")
    img = ImageTk.PhotoImage(Image.open("furas.png"))
    la.configure(image=img)
    la.image = img

root = Tk()
root.title("My app")
root.geometry("680x500+0+0")

b1 = Button(root, text="b1", bg="red")
b1.grid(row=0, column=0)

b2 = Button(root, text="b2", bg="blue", command=callback)
b2.grid(row=0, column=1)

la = Label(root, text="hi")
la.grid(row=1, column=0)

root.mainloop()