如何使用 tkinter/ttk 在 Python 3 中显示图像?
Posted
技术标签:
【中文标题】如何使用 tkinter/ttk 在 Python 3 中显示图像?【英文标题】:How can I display an image in Python 3 using tkinter/ttk? 【发布时间】:2012-07-22 07:04:38 【问题描述】:问题的关键是,我在下面的代码 sn-p 中做错了什么?
from tkinter import *
from tkinter.ttk import *
root = Tk()
myButton = Button(root)
myImage = PhotoImage(myButton, file='myPicture.gif')
myButton.image = myImage
myButton.configure(image=myImage)
root.mainloop()
我从idle3得到的错误信息如下:
>>>
Traceback (most recent call last):
File "/home/bob/Documents/Python/tkImageTest.py", line 9, in <module>
myButton.configure(image=myImage)
File "/usr/lib/python3.2/tkinter/__init__.py", line 1196, in configure
return self._configure('configure', cnf, kw)
File "/usr/lib/python3.2/tkinter/__init__.py", line 1187, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
TypeError: __str__ returned non-string (type Button)
>>>
这个错误信息让我很困惑,我根本不明白它想说什么。有什么想法吗?
我也希望能提出更改建议...
【问题讨论】:
顺便说一句,我已经检查了这个参考effbot.org/tkinterbook/photoimage.htm - 你会看到我的代码 sn-p 看起来非常相似! 错误似乎指向传递给PhotoImage()
的myButton
参数。我不相信PhotoImage()
引用了一个小部件对象,所以这可能会导致错误。在没有它的情况下尝试该行,例如myImage = PhotoImage(file='myPicture.gif')
@Gary,这似乎可以做到。我被一些文档(以及我生成的其他一些错误)误导为认为PhotoImage
需要明确引用根窗口。经过更多的摆弄后,我发现对根目录或按钮本身的引用可以由PhotoImage
构造函数上的另一个配置选项提供,就像这样,PhotoImage(master=myButton, file='myFile.gif')
,但是我编写它的方式,它看起来像 Tkinter name,应该是一个字符串,ofc。
知道了。将我的评论变成了答案,并添加了一些其他有用的信息。
查看***.com/questions/9142509/…中给出的代码
【参考方案1】:
错误似乎指向传递给PhotoImage
的myButton
参数。正如您在评论中指出的那样,PhotoImage
将小部件对象视为字符串(有几个字符串类型的选项;请参阅 PhotoImage 选项列表here)。
如果您在不引用 myButton
对象的情况下实现该行,您的代码将起作用:
myImage = PhotoImage(file='myPicture.gif')
我不确定您是否需要更改 PhotoImage
构造函数。查看PhotoImage
文档以确定该类的有效选项(即资源名称)。引用帮助文件:
关于模块 tkinter 中的类 PhotoImage 的帮助:
类照片图像(图像)
| Widget which can display colored images in GIF, PPM/PGM format. | | Method resolution order: | PhotoImage | Image | builtins.object | | Methods defined here: | | __getitem__(self, key) | # XXX config | | __init__(self, name=None, cnf=, master=None, **kw) | Create an image with NAME. | | Valid resource names: data, format, file, gamma, height, palette, | width.
仅供参考:从 Python 命令行或 IDLE 获取文档的最简单方法:
from tkinter import PhotoImage
help(PhotoImage)
最后,关于这个课程的另一个有用的链接是http://tkinter.unpythonic.net/wiki/PhotoImage。
【讨论】:
非常感谢加里!您对“主”参考也是正确的。这是我用多线程做的一些实验的结果(最好不要问!)。 @Bobble BTW,如果这回答了问题,请将其标记为已接受的答案(这看起来你可以为你的一些问题做些什么)。【参考方案2】:我使用 32 位和 64 位的 python 2.7.9、3.2.5、3.3.5、3.4.3 测试了该示例。 (Win 8.1 64bit)
代码有效。
(在 python 3.4.3 64bit 中,我首先收到一条错误消息。
我已经完全卸载了 3.4.3,然后重新安装。
现在,该示例也适用于 3.4.3 64 位)
# basic code from >>
# http://tkinter.unpythonic.net/wiki/PhotoImage
# extra code -------------------------------------------------------------------------
from __future__ import print_function
try:
import tkinter as tk
except:
import Tkinter as tk
import sys
import platform
print ()
print ('python ', sys.version)
print ('tkinter ', tk.TkVersion)
print ()
print (platform.platform(),' ',platform.machine())
print ()
# basic code -------------------------------------------------------------------------
root = tk.Tk()
def create_button_with_scoped_image():
# "w6.gif" >>
# http://www.inf-schule.de/content/software/gui/entwicklung_tkinter/bilder/w6.gif
img = tk.PhotoImage(file="w6.gif") # reference PhotoImage in local variable
button = tk.Button(root, image=img)
# button.img = img # store a reference to the image as an attribute of the widget
button.image = img # store a reference to the image as an attribute of the widget
button.grid()
create_button_with_scoped_image()
tk.mainloop()
【讨论】:
你确定这是一个答案,更具体地说是 python-3.x 的答案吗? 一个好的答案不仅是一个有效的答案,而且是一个记录在案的答案。如果 OP 不理解它,那么提供代码是没有意义的。他/她应该从答案中学到一些东西,而不是只是复制粘贴它,那样他/她下次会再次问同样的问题,只是在不同的上下文中。 关键是我的 gary 和 Tkinter Wiki 的响应在 Python 3.4.3 中不起作用 我已经编辑了我的帖子; (在 python 3.4.3 64bit 中,我首先收到一条错误消息。我已完全卸载 3.4.3,然后重新安装。现在,该示例也适用于 3.4.3 64 位)以上是关于如何使用 tkinter/ttk 在 Python 3 中显示图像?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 tkinter.ttk Treeview 上完全更改背景颜色
Python 2.7:通过 Ttk 的主题“通用对话框”tkinter 接口?
python 3 - tkinter - ttk treeview:查看列文本