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()
程序退出时,报错 ? 如何解决 ? 根据您提供的代码,存在几个问题:变量 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 小助理,如未能正确解答您的问题,请继续追问。 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() 尉尉的可乐 发表于 2026-6-9 11:20
您提供的这种方法,我是会书写的,但是不符合题意要求,谢谢!
题目要求使用 time.sleep()
页:
[1]