免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9494 | 回复: 9
打印 上一主题 下一主题

Tkinter 用一个button指令触发frame显示图片,Frame为何不能动态显示图片呢? [复制链接]

论坛徽章:
3
处女座
日期:2014-11-05 11:02:4315-16赛季CBA联赛之四川
日期:2015-12-10 14:37:4015-16赛季CBA联赛之天津
日期:2017-09-08 18:39:34
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-12 00:02 |只看该作者 |倒序浏览
以前没做过gui编程 ,现在要写一个小应用,用了tkinter,就是 触发按钮时,在界面上显示图片,写到这儿卡住了,图片怎么都不出来
  1. # -*- coding:utf-8 -*-
  2. from Tkinter import *
  3. from PIL import Image, ImageTk

  4. root = Tk()

  5. image_frame = Frame(root)

  6. image_file = Image.open("F:\\Pie.jpg")

  7. im = ImageTk.PhotoImage(image_file)

  8. image_label = Label(image_frame,image = im).pack(side = LEFT,padx = 5)

  9. image_frame.pack()

  10. root.mainloop()
复制代码
这样显示图片是没问题的


然后改由按钮触发,显示图片
  1. # -*- coding:utf-8 -*-
  2. from Tkinter import *
  3. from PIL import Image, ImageTk

  4. root = Tk()

  5. image_frame = Frame(root)



  6. def create_image_label():
  7.     image_file = Image.open("F:\\Pie.jpg")
  8.     im = ImageTk.PhotoImage(image_file)
  9.     image_label = Label(image_frame,image = im)
  10.     image_label.grid(row = 3, column = 0, sticky = NW, pady = 8, padx = 20)

  11. button = Button(image_frame,text='猛击这里',anchor = 'center',command = create_image_label)
  12. button.grid(row = 2, column = 0, sticky = NW, pady = 8, padx = 20)

  13. image_frame.pack()

  14. root.mainloop()
复制代码
怎么猛击都不显示,泪奔了


但是当我在create_image_label()体的最后一句故意加个错误代码时,尽管后台报错,但是图片显示了
  1. # -*- coding:utf-8 -*-
  2. from Tkinter import *
  3. from PIL import Image, ImageTk

  4. root = Tk()

  5. image_frame = Frame(root)



  6. def create_image_label():
  7.     image_file = Image.open("F:\\Pie.jpg")
  8.     im = ImageTk.PhotoImage(image_file)
  9.     image_label = Label(image_frame,image = im)
  10.     image_label.grid(row = 3, column = 0, sticky = NW, pady = 8, padx = 20)
  11.     image_label.show()

  12. button = Button(image_frame,text='猛击这里',anchor = 'center',command = create_image_label)
  13. button.grid(row = 2, column = 0, sticky = NW, pady = 8, padx = 20)

  14. image_frame.pack()

  15. root.mainloop()
复制代码
frame要怎么样做,才能动态更新呢?

论坛徽章:
3
处女座
日期:2014-11-05 11:02:4315-16赛季CBA联赛之四川
日期:2015-12-10 14:37:4015-16赛季CBA联赛之天津
日期:2017-09-08 18:39:34
2 [报告]
发表于 2013-03-12 13:43 |只看该作者
这个没人遇到过吗 ?

论坛徽章:
0
3 [报告]
发表于 2013-03-12 15:18 |只看该作者
在第2个程序的第16行加入
image_label.image=im;

论坛徽章:
0
4 [报告]
发表于 2013-03-12 15:20 |只看该作者
你这样做,重复点击按钮,会很费内存的,因为label对象创建太多了

论坛徽章:
3
处女座
日期:2014-11-05 11:02:4315-16赛季CBA联赛之四川
日期:2015-12-10 14:37:4015-16赛季CBA联赛之天津
日期:2017-09-08 18:39:34
5 [报告]
发表于 2013-03-12 16:02 |只看该作者
回复 4# foxwb


    先别说费不费内存,如何让Label在Frame上显示呢

论坛徽章:
3
处女座
日期:2014-11-05 11:02:4315-16赛季CBA联赛之四川
日期:2015-12-10 14:37:4015-16赛季CBA联赛之天津
日期:2017-09-08 18:39:34
6 [报告]
发表于 2013-03-12 16:13 |只看该作者
回复 4# foxwb


    我把label对象的初始化放到 外面了,然后button里面的事件就一个在Frame上的显示,这样就可以了。

   这是为什么呢

论坛徽章:
0
7 [报告]
发表于 2013-03-12 23:33 |只看该作者
问题很简单,因为create_image_label()结束后,图像就自动销毁了,因为
其内部的image_file/im/image_label都是局部变量,仅在函数内存活。
所以要使用全局变量。
# -*- coding:utf-8 -*-
from Tkinter import *
from PIL import Image, ImageTk

root = Tk()

image_frame = Frame(root)

image_file = im = image_label = None
def create_image_label():
    global image_file, im, image_label   
    image_file = Image.open("F:\\Pie.jpg")
    im = ImageTk.PhotoImage(image_file)
    image_label = Label(image_frame,image = im)
    image_label.grid(row = 3, column = 0, sticky = NW, pady = 8, padx = 20)

button = Button(image_frame,text='猛击这里',anchor = 'center',command = create_image_label)
button.grid(row = 2, column = 0, sticky = NW, pady = 8, padx = 20)

image_frame.pack()

root.mainloop()

论坛徽章:
3
处女座
日期:2014-11-05 11:02:4315-16赛季CBA联赛之四川
日期:2015-12-10 14:37:4015-16赛季CBA联赛之天津
日期:2017-09-08 18:39:34
8 [报告]
发表于 2013-03-13 00:08 |只看该作者
本帖最后由 godymoon 于 2013-03-13 00:09 编辑

回复 7# cdhigh


    是这样啊,竟然是生命周期的问题  太汗颜了

   非常感谢

   能告诉我你的 qq吗?还想多跟你学点tkinter相关的知识啊,看了你的tkinter那篇精华帖,受益匪浅啊

论坛徽章:
0
9 [报告]
发表于 2013-03-13 00:16 |只看该作者
我一般不上QQ,如果要交流可以发论坛信息,或者cdhigh (at) sohu.com

论坛徽章:
3
处女座
日期:2014-11-05 11:02:4315-16赛季CBA联赛之四川
日期:2015-12-10 14:37:4015-16赛季CBA联赛之天津
日期:2017-09-08 18:39:34
10 [报告]
发表于 2013-03-13 00:24 |只看该作者
回复 9# cdhigh


    哦,好的  ,感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP