Python 如何在def函数中使用tkinter从url发布图像
我的问题的标题可能相当混乱,但我不知道如何更好地表达它 基本上,当我将代码放在按钮命令的def中时,它不起作用,但代码在def之外工作正常 这是不起作用的代码:Python 如何在def函数中使用tkinter从url发布图像,python,tkinter,Python,Tkinter,我的问题的标题可能相当混乱,但我不知道如何更好地表达它 基本上,当我将代码放在按钮命令的def中时,它不起作用,但代码在def之外工作正常 这是不起作用的代码: app = Tk() app.geometry("1000x800") def search(): tx1get = tx1.get() Label(app, text="You Entered: \"" + tx1get + "\"").grid(row=1, column=0) fd = urllib.ur
app = Tk()
app.geometry("1000x800")
def search():
tx1get = tx1.get()
Label(app, text="You Entered: \"" + tx1get + "\"").grid(row=1, column=0)
fd = urllib.urlopen("http://ia.media-imdb.com/images/M/MV5BMTc2MTU4ODI5MF5BMl5BanBnXkFtZTcwODI2MzAyOA@@._V1_SY317_CR7,0,214,317_AL_.jpg")
imgFile = io.BytesIO(fd.read())
im = ImageTk.PhotoImage(Image.open(imgFile))
image = Label(app, image = im, bg = "blue")
image.grid(row=2, column=0)
tx1=StringVar()
tf = Entry(app, textvariable=tx1, width="100")
b1 = Button(app, text="Search", command=search, width="10")
tf.grid(row=0, column=0)
b1.grid(row=0, column=1)
app.mainloop()
但是,如果我拆下def中的最后5条管路,并将它们放在def外部,则它会起作用:
app = Tk()
app.geometry("1000x800")
def search():
tx1get = tx1.get()
Label(app, text="You Entered: \"" + tx1get + "\"").grid(row=1, column=0)
tx1=StringVar()
tf = Entry(app, textvariable=tx1, width="100")
b1 = Button(app, text="Search", command=search, width="10")
tf.grid(row=0, column=0)
b1.grid(row=0, column=1)
fd = urllib.urlopen("http://ia.media-imdb.com/images/M/MV5BMTc2MTU4ODI5MF5BMl5BanBnXkFtZTcwODI2MzAyOA@@._V1_SY317_CR7,0,214,317_AL_.jpg")
imgFile = io.BytesIO(fd.read())
im = ImageTk.PhotoImage(Image.open(imgFile))
image = Label(app, image = im, bg = "blue")
image.grid(row=2, column=0)
app.mainloop()
非常感谢您的任何帮助或建议 您的代码不起作用,因为
search
中的im
一旦search
完成,就会超出范围。这样,ImageTk对象也会消失。要防止这种情况,请将im
设为全局(一种可能的解决方案):
导入urllib
从Tkinter进口*
输入io
从PIL导入图像,ImageTk
app=Tk()
附录几何(“1000x800”)
im=没有#很好。谢谢marcin!
import urllib
from Tkinter import *
import io
from PIL import Image, ImageTk
app = Tk()
app.geometry("1000x800")
im = None #<-- im is global
def search():
global im #<-- declar im as global, so that you can write to it
# not needed if you only want to read from global variable.
tx1get = tx1.get()
Label(app, text="You Entered: \"" + tx1get + "\"").grid(row=1, column=0)
fd = urllib.urlopen("http://ia.media-imdb.com/images/M/MV5BMTc2MTU4ODI5MF5BMl5BanBnXkFtZTcwODI2MzAyOA@@._V1_SY317_CR7,0,214,317_AL_.jpg")
imgFile = io.BytesIO(fd.read())
im = ImageTk.PhotoImage(Image.open(imgFile))
image = Label(app, image = im, bg = "blue")
image.grid(row=2, column=0)
tx1=StringVar()
tf = Entry(app, textvariable=tx1, width="100")
b1 = Button(app, text="Search", command=search, width="10")
tf.grid(row=0, column=0)
b1.grid(row=0, column=1)
app.mainloop()