当我尝试从光盘上显示图像而不从互联网上下载图像时,一切正常,并且图像显示正确。但是,当我尝试从我的网站下载图像时,将其扩展名更改为.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()
答案 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()