鱼C论坛

 找回密码
 立即注册
查看: 40|回复: 7

[已解决]Tkinter 如何在两个图片之间交替变换 ?

[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

  1. from tkinter import *
  2. root=Tk()
  3. p=PhotoImage(file="d://5-17.png")
  4. q=PhotoImage(file="d://5-18.png")
  5. o=Button(root)
  6. o.pack()
  7. m=StringVar()
  8. def n():
  9.         if m.get()==p :
  10.                 m.set(q)
  11.         else :
  12.                 m.set(p)
  13.         o.config(image=m.get())
  14.         o.after(2000,n)
  15. n()
  16. mainloop()
复制代码


最佳答案
7 天前
试试把变量改成普通的字符串变量,然后用 PhotoImage 对象本身来做切换,代码会更简洁一些:

```python
from tkinter import *

root = Tk()

p = PhotoImage(file='d://5-17.png')
q = PhotoImage(file='d://5-18.png')

current = [p]  # 用列表包装,方便在函数里修改

def toggle():
    current[0] = q if current[0] == p else p
    o.config(image=current[0])
    o.after(2000, toggle)

o = Button(root, image=p)
o.pack()
toggle()

root.mainloop()
```

主要改动:用 current 列表保存当前图片,toggle 函数里直接切换对象然后更新按钮图片,不依赖 StringVar。

5-17

5-17

5-18

5-18
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
您的问题是希望在Tkinter中实现两个图片之间的交替变换。您的代码尝试使用 StringVar 来存储图片对象,但 StringVar 只能存储字符串,不能直接存储 PhotoImage 对象。正确的做法是使用一个普通的变量来保存当前图片引用,或者用一个布尔标志来控制切换。

下面是一个简单易懂的修正方案:


  1. from tkinter import *

  2. root = Tk()
  3. p = PhotoImage(file="d://5-17.png")
  4. q = PhotoImage(file="d://5-18.png")

  5. # 创建一个按钮,初始显示图片 p
  6. o = Button(root, image=p)
  7. o.pack()

  8. # 定义切换函数
  9. flag = True  # 用布尔值控制显示哪张图片
  10. def swap():
  11.     global flag
  12.     if flag:
  13.         o.config(image=q)
  14.         flag = False
  15.     else:
  16.         o.config(image=p)
  17.         flag = True
  18.     # 每隔2000毫秒(2秒)再次调用自己
  19.     o.after(2000, swap)

  20. # 启动首次切换
  21. swap()

  22. mainloop()
复制代码


**解释:**  
1. 使用一个布尔变量 flag 来记录当前显示的是哪张图片。  
2. 在 swap() 函数中,根据 flag 的值切换按钮的 image 属性,并翻转状态。  
3. 通过 after(2000, swap) 实现每2秒自动重复调用,形成循环交替。

这样您的代码就能正确实现两张图片交替变换了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
FishC 发表于 2026-5-17 17:14
您的问题是希望在Tkinter中实现两个图片之间的交替变换。您的代码尝试使用 StringVar 来存储图片对象,但 S ...


噢,原来是这样啊!

字 符 型 变 量 不 能 存 储 PhotoImage 对 象 !

如 果 我 要 是 其 它 方 法( 获 取 按 钮 的 属 性 值 的 方 法 ),怎 么 也 不 能 变 换 图 片 呢  ?

  1. from tkinter import *
  2. root=Tk()
  3. p=PhotoImage(file="d://5-17.png")
  4. q=PhotoImage(file="d://5-18.png")
  5. o=Button(root)
  6. o.pack()
  7. def k():
  8.         if o.cget("image")==p:
  9.                 o.config(image=q)
  10.         else:
  11.                 o.config(image=p)
  12.         o.after(2000,k)
  13. k()
  14. mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
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"))) 来验证。

**正确的做法**:不要依赖比较字符串,而是用一个简单的标志变量来跟踪当前状态,就像之前的回答那样。或者可以使用一个列表来存储两张图片,用一个索引来控制切换,比如:  

  1.   
  2. from tkinter import *  

  3. root = Tk()  
  4. p = PhotoImage(file="d://5-17.png")  
  5. q = PhotoImage(file="d://5-18.png")  

  6. # 将图片放入列表,方便索引  
  7. images = [p, q]  
  8. current = 0  # 索引0显示p,索引1显示q  

  9. o = Button(root, image=images[current])  
  10. o.pack()  

  11. def k():  
  12.     global current  
  13.     # 切换索引:0变成1,1变成0  
  14.     current = 1 - current  
  15.     o.config(image=images[current])  
  16.     o.after(2000, k)  

  17. k()  
  18. mainloop()  
复制代码


这样既简洁又避免了对象比较的陷阱。  

总结:  
      
  • cget("image") 返回字符串,无法与原始 PhotoImage 对象直接比较。  
  • 推荐使用标志变量或索引列表来控制显示哪张图片。  


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
FishC 发表于 2026-5-17 17:28
您通过 o.cget("image") 来获取按钮当前显示的图片,然后与 p 对象进行比较,这无法正常工作。原因在于 ...
好哒,明白了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
dragov 发表于 2026-05-17 17:31
FishC 发表于 2026-5-17 17:28
您通过 o.cget("image ...


很好,您已经理解了关键点。如果后续还有其他Tkinter或Python问题,欢迎继续提问。祝学习愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层    本楼为最佳答案   
试试把变量改成普通的字符串变量,然后用 PhotoImage 对象本身来做切换,代码会更简洁一些:

```python
from tkinter import *

root = Tk()

p = PhotoImage(file='d://5-17.png')
q = PhotoImage(file='d://5-18.png')

current = [p]  # 用列表包装,方便在函数里修改

def toggle():
    current[0] = q if current[0] == p else p
    o.config(image=current[0])
    o.after(2000, toggle)

o = Button(root, image=p)
o.pack()
toggle()

root.mainloop()
```

主要改动:用 current 列表保存当前图片,toggle 函数里直接切换对象然后更新按钮图片,不依赖 StringVar。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
小派 发表于 2026-5-17 17:32
试试把变量改成普通的字符串变量,然后用 PhotoImage 对象本身来做切换,代码会更简洁一些:

```python
...

您提供的这种方法,很好
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-5-24 18:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表