选择文件后 Tkinter 照片没有改变
Tkinter photo not changing after file selection
我正在尝试实现一个简单的 python GUI 程序,允许用户 select 照片并在 window 中查看它以供参考。
这是我的代码:
from tkinter import *
from tkinter.filedialog import askopenfilename
from PIL import Image, ImageTk
filename = "none"
photo1 = ImageTk.PhotoImage
def fileSelect():
global filename
filename = askopenfilename() #input file
global photo1
imageShow = Image.open(filename)
imageShow = imageShow.resize((300, 350), Image.ANTIALIAS)
photo1 = ImageTk.PhotoImage(imageShow)
window = Tk() #Creating window
window.title("Example") #Title of window
imageFirst = Image.open("first.jpg")
imageFirst = imageFirst.resize((300, 350), Image.ANTIALIAS)
photo1 = ImageTk.PhotoImage(imageFirst)
Label (window, image=photo1, bg="white").pack(pady=30) #Display image
Button(window, text="Select File", font="none 16", width=15, command=fileSelect).pack(pady=15)
window.mainloop()
如您所见,photo1
被声明为全局变量以允许 fileSelect()
函数访问和更改它。程序启动时,将显示默认的初始图像,稍后将由用户 selected 图像替换。
我面临的问题是,在用户 select 编辑图像后,原始照片消失了,但新的 select 图像没有出现。我不明白为什么会这样。有什么帮助吗?
给你,开始像这样改变你的标签,这样它就不会 return None
.
img_l = Label(window, image=photo1, bg="white")
img_l.pack(pady=30) #Display image
然后,将函数更改为:
def fileSelect():
global filename, photo1 #keeping reference
filename = askopenfilename() #input file
imageShow = Image.open(filename).resize((300, 350), Image.ANTIALIAS)
photo1 = ImageTk.PhotoImage(imageShow) #instantiate
img_l.config(image=photo1) #updating the image
config()
方法更新标签的图像,更改 PhotoImage 实例的图像无济于事。
您也可以删除代码顶部的 photo1 = ImageTk.PhotoImage
,因为它没有用。
不过请记住,不选择任何文件,仍会return出错。这是一个解决方法:
def fileSelect():
global filename, photo1
try:
filename = askopenfilename() #input file
imageShow = Image.open(filename).resize((300, 350), Image.ANTIALIAS)
photo1 = ImageTk.PhotoImage(imageShow)
img_l.config(image=photo1)
except AttributeError:
pass
希望这解决了错误,如有任何疑问,请告诉我。
干杯
我正在尝试实现一个简单的 python GUI 程序,允许用户 select 照片并在 window 中查看它以供参考。
这是我的代码:
from tkinter import *
from tkinter.filedialog import askopenfilename
from PIL import Image, ImageTk
filename = "none"
photo1 = ImageTk.PhotoImage
def fileSelect():
global filename
filename = askopenfilename() #input file
global photo1
imageShow = Image.open(filename)
imageShow = imageShow.resize((300, 350), Image.ANTIALIAS)
photo1 = ImageTk.PhotoImage(imageShow)
window = Tk() #Creating window
window.title("Example") #Title of window
imageFirst = Image.open("first.jpg")
imageFirst = imageFirst.resize((300, 350), Image.ANTIALIAS)
photo1 = ImageTk.PhotoImage(imageFirst)
Label (window, image=photo1, bg="white").pack(pady=30) #Display image
Button(window, text="Select File", font="none 16", width=15, command=fileSelect).pack(pady=15)
window.mainloop()
如您所见,photo1
被声明为全局变量以允许 fileSelect()
函数访问和更改它。程序启动时,将显示默认的初始图像,稍后将由用户 selected 图像替换。
我面临的问题是,在用户 select 编辑图像后,原始照片消失了,但新的 select 图像没有出现。我不明白为什么会这样。有什么帮助吗?
给你,开始像这样改变你的标签,这样它就不会 return None
.
img_l = Label(window, image=photo1, bg="white")
img_l.pack(pady=30) #Display image
然后,将函数更改为:
def fileSelect():
global filename, photo1 #keeping reference
filename = askopenfilename() #input file
imageShow = Image.open(filename).resize((300, 350), Image.ANTIALIAS)
photo1 = ImageTk.PhotoImage(imageShow) #instantiate
img_l.config(image=photo1) #updating the image
config()
方法更新标签的图像,更改 PhotoImage 实例的图像无济于事。您也可以删除代码顶部的
photo1 = ImageTk.PhotoImage
,因为它没有用。不过请记住,不选择任何文件,仍会return出错。这是一个解决方法:
def fileSelect(): global filename, photo1 try: filename = askopenfilename() #input file imageShow = Image.open(filename).resize((300, 350), Image.ANTIALIAS) photo1 = ImageTk.PhotoImage(imageShow) img_l.config(image=photo1) except AttributeError: pass
希望这解决了错误,如有任何疑问,请告诉我。
干杯