Tkinter 如何在两个图片之间交替变换 ?
from tkinter import *
root=Tk()
p=PhotoImage(file="d://5-17.png")
q=PhotoImage(file="d://5-18.png")
o=Button(root)
o.pack()
m=StringVar()
def n():
if m.get()==p :
m.set(q)
else :
m.set(p)
o.config(image=m.get())
o.after(2000,n)
n()
mainloop()
您的问题是希望在Tkinter中实现两个图片之间的交替变换。您的代码尝试使用 StringVar 来存储图片对象,但 StringVar 只能存储字符串,不能直接存储 PhotoImage 对象。正确的做法是使用一个普通的变量来保存当前图片引用,或者用一个布尔标志来控制切换。
下面是一个简单易懂的修正方案:
from tkinter import *
root = Tk()
p = PhotoImage(file="d://5-17.png")
q = PhotoImage(file="d://5-18.png")
# 创建一个按钮,初始显示图片 p
o = Button(root, image=p)
o.pack()
# 定义切换函数
flag = True# 用布尔值控制显示哪张图片
def swap():
global flag
if flag:
o.config(image=q)
flag = False
else:
o.config(image=p)
flag = True
# 每隔2000毫秒(2秒)再次调用自己
o.after(2000, swap)
# 启动首次切换
swap()
mainloop()
**解释:**
1. 使用一个布尔变量 flag 来记录当前显示的是哪张图片。
2. 在 swap() 函数中,根据 flag 的值切换按钮的 image 属性,并翻转状态。
3. 通过 after(2000, swap) 实现每2秒自动重复调用,形成循环交替。
这样您的代码就能正确实现两张图片交替变换了。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-5-17 17:14
您的问题是希望在Tkinter中实现两个图片之间的交替变换。您的代码尝试使用 StringVar 来存储图片对象,但 S ...
噢,原来是这样啊!
字 符 型 变 量 不 能 存 储 PhotoImage 对 象 !
如 果 我 要 是 其 它 方 法( 获 取 按 钮 的 属 性 值 的 方 法 ),怎 么 也 不 能 变 换 图 片 呢?
from tkinter import *
root=Tk()
p=PhotoImage(file="d://5-17.png")
q=PhotoImage(file="d://5-18.png")
o=Button(root)
o.pack()
def k():
if o.cget("image")==p:
o.config(image=q)
else:
o.config(image=p)
o.after(2000,k)
k()
mainloop() dragov 发表于 2026-05-17 17:27
FishC 发表于 2026-5-17 17:14
您的问题是希望在Tkin ...
您通过 o.cget("image") 来获取按钮当前显示的图片,然后与 p 对象进行比较,这无法正常工作。原因在于:
[*] cget("image") 返回的不是 PhotoImage 对象本身,而是一个 **字符串**(例如 "pyimage1" 这样的图片标识符)。
[*] 您用 == p 来比较字符串和 PhotoImage 对象,结果永远为 False,所以 if 条件始终不成立,图片就不会切换。
您可以自行测试:在 k() 函数中添加 print(repr(o.cget("image"))) 和 print(type(o.cget("image"))) 来验证。
**正确的做法**:不要依赖比较字符串,而是用一个简单的标志变量来跟踪当前状态,就像之前的回答那样。或者可以使用一个列表来存储两张图片,用一个索引来控制切换,比如:
from tkinter import *
root = Tk()
p = PhotoImage(file="d://5-17.png")
q = PhotoImage(file="d://5-18.png")
# 将图片放入列表,方便索引
images =
current = 0# 索引0显示p,索引1显示q
o = Button(root, image=images)
o.pack()
def k():
global current
# 切换索引:0变成1,1变成0
current = 1 - current
o.config(image=images)
o.after(2000, k)
k()
mainloop()
这样既简洁又避免了对象比较的陷阱。
总结:
[*] cget("image") 返回字符串,无法与原始 PhotoImage 对象直接比较。
[*] 推荐使用标志变量或索引列表来控制显示哪张图片。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-5-17 17:28
您通过 o.cget("image") 来获取按钮当前显示的图片,然后与 p 对象进行比较,这无法正常工作。原因在于 ...
好哒,明白了 dragov 发表于 2026-05-17 17:31
FishC 发表于 2026-5-17 17:28
您通过 o.cget("image ...
很好,您已经理解了关键点。如果后续还有其他Tkinter或Python问题,欢迎继续提问。祝学习愉快!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 试试把变量改成普通的字符串变量,然后用 PhotoImage 对象本身来做切换,代码会更简洁一些:
```python
from tkinter import *
root = Tk()
p = PhotoImage(file='d://5-17.png')
q = PhotoImage(file='d://5-18.png')
current = # 用列表包装,方便在函数里修改
def toggle():
current = q if current == p else p
o.config(image=current)
o.after(2000, toggle)
o = Button(root, image=p)
o.pack()
toggle()
root.mainloop()
```
主要改动:用 current 列表保存当前图片,toggle 函数里直接切换对象然后更新按钮图片,不依赖 StringVar。 小派 发表于 2026-5-17 17:32
试试把变量改成普通的字符串变量,然后用 PhotoImage 对象本身来做切换,代码会更简洁一些:
```python
...
{:7_123:} 您提供的这种方法,很好{:7_138:}
页:
[1]