dragov 发表于 3 天前

Tkinter 循 环 显 示 的 程 序



from tkinter import *
import time
root = Tk()
n = ["冬瓜","南瓜","西瓜","窝瓜","黄瓜","香瓜","菜瓜","哈密瓜","苦瓜"]
m = Button(root, text=n)
m.pack()

def melon():
    for i in range(len(n)):
      m.config(text=n)
      root.update()
      time.sleep(3)
    m.after(3000, melon)

melon()
mainloop()


程序退出时,报错 ? 如何解决 ?

FishC 发表于 3 天前

根据您提供的代码,存在几个问题:变量 n 未正确赋值,melon 函数中循环逻辑有误,并且程序退出时因 after 回调仍在执行而报错。下面给出修正方案和原因说明。

问题原因
退出时报错是因为 root.after(3000, melon) 在窗口关闭后仍被调用,此时控件已不存在,访问 m.config() 会触发 TclError 异常。

修正示例
使用 after 代替 time.sleep,并在每次回调前检查窗口是否还存在。


from tkinter import *

root = Tk()

texts = ["A", "B", "C"]# 要循环显示的文本列表
index = 0

m = Button(root, text=texts)
m.pack()

def update_text():
    global index
    # 更新按钮文本
    m.config(text=texts)
    index = (index + 1) % len(texts)
    # 仅在窗口存在时调度下一次更新
    if root.winfo_exists():
      root.after(3000, update_text)

update_text()
root.mainloop()


说明

[*] 用列表 texts 存储要显示的文本。
[*] 用全局变量 index 追踪当前显示位置,每次更新后取模实现循环。
[*] 调用 root.after(3000, update_text) 实现 3 秒后自动更新,避免阻塞主循环。
[*] 在 update_text 内部使用 root.winfo_exists() 判断窗口是否仍然存在,若存在才调度下一次更新,从而消除退出时的报错。


如果坚持使用循环+time.sleep
也可以使用 try...except 捕获异常,但不推荐,因为 sleep 会阻塞界面响应。


def melon():
    try:
      for i in range(len(texts)):
            m.config(text=texts)
            root.update()
            time.sleep(3)
    except:
      pass
    root.after(3000, melon)


但建议采用第一个示例,更优雅且符合 Tkinter 事件驱动机制。

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

尉尉的可乐 发表于 前天 11:20

from tkinter import *

root = Tk()
root.title("自动切换瓜")

n = ["冬瓜","南瓜","西瓜","窝瓜","黄瓜","香瓜","菜瓜","哈密瓜","苦瓜"]
m = Button(root, text=n)
m.pack()

index = 0

def melon():
    global index
    m.config(text=n)
    index = (index + 1) % len(n)
    m.after(3000, melon)

melon()
mainloop()

dragov 发表于 昨天 11:52

尉尉的可乐 发表于 2026-6-9 11:20




您提供的这种方法,我是会书写的,但是不符合题意要求,谢谢!

题目要求使用 time.sleep()
页: [1]
查看完整版本: Tkinter 循 环 显 示 的 程 序