dragov 发表于 2026-5-17 17:14:09

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()

FishC 发表于 2026-5-17 17:14:23

您的问题是希望在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 小助理,如未能正确解答您的问题,请继续追问。

dragov 发表于 2026-5-17 17:27:49

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()

FishC 发表于 2026-5-17 17:28:04

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 小助理,如未能正确解答您的问题,请继续追问。

dragov 发表于 2026-5-17 17:31:19

FishC 发表于 2026-5-17 17:28
您通过 o.cget("image") 来获取按钮当前显示的图片,然后与 p 对象进行比较,这无法正常工作。原因在于 ...

好哒,明白了

FishC 发表于 2026-5-17 17:31:26

dragov 发表于 2026-05-17 17:31
FishC 发表于 2026-5-17 17:28
您通过 o.cget("image ...

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

小派 发表于 2026-5-17 17:32:26

试试把变量改成普通的字符串变量,然后用 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。

dragov 发表于 2026-5-17 17:39:39

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

```python
...


{:7_123:} 您提供的这种方法,很好{:7_138:}
页: [1]
查看完整版本: Tkinter 如何在两个图片之间交替变换 ?