使用 Tkinter 显示图像

2024-03-25

我正在开发一个使用 Tkinter 和 ImageTk 显示一系列图像的 python 程序。我无法显示多个图像。下面是一个重现该错误的完整小程序。程序直接递归地搜索当前的 jpg 文件,并在用户按 Enter 时显示它们。

import Tkinter, ImageTk,os, re


def ls_rec(direc):
    try:
        ls = os.listdir(direc)
    except Exception as e:
        return
    for f in os.listdir(direc):
        fpath = os.path.join(direc, f)
        if os.path.isfile(fpath):
            yield fpath
        elif os.path.isdir(fpath):
            for f2 in iterate_dir(os.path.join(direc,f)):
                yield f2

images = filter(lambda a:re.match('.*\\.jpg$',a),ls_rec(os.getcwd()))
assert(len(images)>10)
top = Tkinter.Tk()
image_label = Tkinter.Label(top)
Label_text = Tkinter.Label(top,text="Below is an image")
img = None
i = 0



def get_next_image(event = None):
    global i, img
    i+=1
    img = ImageTk.PhotoImage(images[i])
    label.config(image=img)
    label.image = img

top.bind('<Enter>',get_next_image)
label.pack(side='bottom')
Label_text.pack(side='top')
get_next_image()
top.mainloop()

程序失败并出现以下回溯:

Traceback (most recent call last):
  File "/usr/lib/python2.7/pdb.py", line 1314, in main
    pdb._runscript(mainpyfile)
  File "/usr/lib/python2.7/pdb.py", line 1233, in _runscript
    self.run(statement)
  File "/usr/lib/python2.7/bdb.py", line 387, in run
    exec cmd in globals, locals
  File "<string>", line 1, in <module>
  File "/home/myuser/Projects/sample_images.py", line 1, in <module>
    import Tkinter, ImageTk,os, re
  File "/home/myuser/Projects/sample_images.py", line 32, in get_next_image
    img = ImageTk.PhotoImage(some_image[1])
  File "/usr/lib/python2.7/dist-packages/PIL/ImageTk.py", line 109, in __init__
    mode = Image.getmodebase(mode)
  File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 245, in getmodebase
    return ImageMode.getmode(mode).basemode
  File "/usr/lib/python2.7/dist-packages/PIL/ImageMode.py", line 50, in getmode
    return _modes[mode]
KeyError: '/home/myuser/sampleimage.jpg'

运行此代码时有人会得到相同的行为吗?我究竟做错了什么?

编辑:使用 korylprince 的解决方案并进行一些清理,以下是原始代码的工作版本:

import os, re, Tkinter, ImageTk

def ls_rec(direc, filter_fun=lambda a:True):
    for (dirname, dirnames, fnames) in os.walk(direc):
        for fname in fnames:
            if filter_fun(fname):
                yield os.path.join(dirname,fname)


top = Tkinter.Tk()
image_label = Tkinter.Label(top)
text_label = Tkinter.Label(top,text="Below is an image")
images = ls_rec(os.getcwd(), lambda a:re.match('.*\\.jpg$',a))

imgL = []

def get_next_image(event = None):
    fname = images.next()
    print fname
    fhandle = open(fname)
    img = ImageTk.PhotoImage(file=fhandle)
    fhandle.close()
    imgL.append(img)
    image_label.config(image=img)


top.bind('<Return>',get_next_image)
image_label.pack(side='bottom')
text_label.pack(side='top')
get_next_image()
top.mainloop()

Edit: top.bind('<Enter>'...)实际上绑定了鼠标进入框架的事件,而不是用户按下 Enter 键。正确的行是top.bind('<Return>',...).


ImageTk.PhotoImage并没有真正正确记录。

你应该尝试这样的事情:

#outside of functions
images = list()

#inside function
global images
with open(images[i]) as f:
    img = ImageTk.PhotoImage(file=f)
    images.append(img)

将图像放入列表的原因是为了让 python 能够引用它。否则垃圾收集器最终将删除图像对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Tkinter 显示图像 的相关文章

随机推荐

  • 许多基于backbone.js 的框架在现实世界中的优点和缺点是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 希望有人可以分享他们对一些最新出现的backbone js 变体的经验 我在几个项目中对主干 下划线 需求有一些很好的经验 我希望下一步朝着复杂
  • 寻找在巨大的 Pandas Dataframe 中对行进行切片的最快方法

    我的程序需要根据一个巨大的 Pandas Dataframe 中的列值获取一行 响应时间至关重要 我使用最常见的方法来做到这一点 例如 df loc df id 500000 Per timeit在我的 Mac 上 对 100 万行的数据帧
  • 我的 @media 查询无法在移动设备上运行

    如果浏览器宽度小于五个图像 包括边距等 我试图允许每行保存五个图像的容器更改其宽度的大小 我添加了以下媒体查询 在台式计算机上浏览时一切正常 将浏览器大小调整为宽度小于 1080 像素 容器更改宽度且内容居中 但是 在移动设备 iPhone
  • extract>> 运算符在 C++ 中到底如何工作

    我是一名计算机科学专业的学生 因此对 C 语言 考虑到这是我使用这种语言的第一个学期 或编码方面没有太多经验 我被分配从文本文件中读取整数 其简单形式如下 19 3 2 9 14 4 5 9 10 3 这让我踏上了更好地理解 I O 操作符
  • 声明式 SQLAlchemy 中的标签字典?

    我正在开发一个相当大的代码库 该代码库已使用sqlalchemy ext declarative 我需要向其中一个类添加一个类似字典的属性 我需要的是一样的这个问题 https stackoverflow com questions 780
  • 在函数中使用设置间隔和获取

    创建一个函数startShowingMessage它有两个参数 一个元素和一个 URL 字符串 该函数将使用setInterval每 1 秒执行以下任务 获取 URL 并将响应文本放入所提供元素的文本内容中 我制作了该函数并且获取有效 但我
  • HTML5 使用什么视频格式以及为什么它与 iPad 上的 Safari 兼容

    HTML5支持哪些视频格式与iPhone iPad兼容 我正在考虑建立一个带有一些教学视频的网站 但现在我很困惑 因为我认为 Apple 移动设备仅支持 Quicktime 它使用 H 264 尽管 HTML5 规范并未将其描述为必须使用
  • 使用 SQLalchemy 读取大文件

    我正在尝试使用 SQLalchemy 读取 200 MB 的 csv 文件 每行大约有 30 列 其中 我使用下面的代码仅使用 8 列 然而 代码运行速度非常慢 有没有办法改善这一点 我想使用地图 列表理解或其他技术 正如你所说 我是一个新
  • 使用 Linq 从 xml 文件读取值

    我在从 xml 文件读取值时遇到问题 这是 xml 文件
  • 如何在此数据上使用 PIVOT:?

    我有一个 SQL Server 表 如下所示 RESOURCE DESCRIPTION VALUE Test A Name Resource A xyz Test A Height 20 Test A Unit ft Test A Loca
  • IntelliJ 15 运行缓慢并占用 1GB 内存

    我刚刚安装了intelliJ IDEA 15但它有点滞后并且使用大量内存 有时 我的 4GB RAM 笔记本电脑上的内存会超过 1GB 以前的版本是intelliJ性能更好 我怎样才能让它更快 我遇到的另一个问题是自动完成和更正 这两个设置
  • RQ - 清空和删除队列

    我在用着RQ http python rq org 我有一个failed排队有数千件物品 还有另一个test我不久前创建的用于测试的队列现在是空的且未使用 我想知道如何删除所有作业failed排队 然后删除test完全排队吗 对于基本问题表
  • 以阻塞程序语言的方式进行异步?

    Sync way 例如 红宝石 con Mysql new localhost rs1 con query select from test01 A rs2 con query select from test02 B rs getResu
  • 适用于 Visual Studio 2013 的 System.Data.SQlite

    System Data SQLite 的当前发行版无法与 Visual Studio 2013 一起使用 除非您部署 VS2012 Update3 发行包 大概 或仅安装 像我一样在测试机器上 完整版本 有谁知道 System Data S
  • jquery如何比较两个日期

    第一个使用 id 的有格式 var checkindate check in text 28 07 2011 然后我使用当前日期 var now new Date 它的格式是 Wed Jul 20 2011 19 09 46 GMT 053
  • 在 MathLink 函数中检查中止?

    我刚刚发现这样的MathLink功能为LinkWrite and LinkRead有类似其内部的东西CheckAbort吸收任何中止 并且不会进一步传播它们 这可以很容易地显示为LinkRead link LinkLaunch First
  • 返回由 n 个随机数组成的整数 ArrayList?

    如何创建 RandomArray 方法并让它接受整数 n 并返回由 0 到 255 之间的 n 个随机数组成的整数 ArrayList 换句话说 让返回的数组的大小为 n 我使用的是Java Eclipse 我已经创建了 RandomArr
  • Awesome WM:标题栏的图标是什么意思?

    谁能告诉我标题栏中的图标是什么意思 火箭 加号 明星 我很好奇 查看图标的文件名 第一个组件描述了含义 https github com awesomeWM awesome tree master themes default titleb
  • 多处理池内进程超时

    当我使用以下代码时 池结果总是返回超时 我在做的事情在逻辑上是否不正确 from multiprocessing import Pool Process cpu count def add num return num 1 def add
  • 使用 Tkinter 显示图像

    我正在开发一个使用 Tkinter 和 ImageTk 显示一系列图像的 python 程序 我无法显示多个图像 下面是一个重现该错误的完整小程序 程序直接递归地搜索当前的 jpg 文件 并在用户按 Enter 时显示它们 import T