python tkiner canvas 动态添加图片问题

DaiZZZZZ 2016-10-30 10:41:51
我想在canvas中动态显示图片,因为在图片是在窗口运行之后,从文件中选择的。通过button出发show()函数,函数中创建图片和一条线,线可以显示,但图片不显示。请问有什么好的方法更新图片吗?万分感激

def show(event):
img = Image.open("im/house2.jpg")
img = ImageTk.PhotoImage(img)
im = can.create_image(250, 150, image=img)
l=can.create_line(10,10,50,50,width=5)



root=Tk()
root.title('Canvas')
can=Canvas(root,bg='blue')
# can.create_line(10,10,50,50)
can.grid()
button=Button(height=1,width=20,text='button',bg='red')
button.bind("<Button-1>",show)
button.grid()


root.mainloop()
...全文
877 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
DaiZZZZZ 2016-10-31
  • 打赏
  • 举报
回复 1
谢谢你!现在可以了。载入图片的操作仍然放在触发函数里执行。创建一个全局变量img=None,在函数上加了global img引用全局变量,这样在退出函数时,存储图片的变量不会被销毁,画板上就可以显示图片了。奇怪的是,被引用的内存对象不应该是被保留的吗?在can.create_image(250, 150, image=img) 之后,img所引用的对象也被参数image引用了,可退出函数后,画板上没有显示图片,说明存储图片的内存对象还是被销毁了。对这点我比较迷惑。

def show(event):
    img = Image.open("im/house2.jpg")
    img = ImageTk.PhotoImage(img)
    im = can.create_image(250, 150, image=img)
    l=can.create_line(10,10,50,50,width=5)
hijack00 2016-10-30
  • 打赏
  • 举报
回复
from PIL import Image, ImageTk def show(event): can.create_image(250, 150, image=img) can.create_line(10,10,50,50,width=5) root=Tk() root.title('Canvas') can=Canvas(root,bg='blue') can.grid() button=Button(height=1,width=20,text='button',bg='red') button.bind("<Button-1>",show) button.grid() img = Image.open("im/house2.jpg") img = ImageTk.PhotoImage(img) root.mainloop()

37,721

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧