tkinter函数接收列表参数循环执行时多列表同时处理如何解决
问题原因
你遇到的问题是每次点击按钮调用sample_function时,都会注册一个全新的after定时循环任务,此前注册的旧任务不会被自动销毁,因此点击第二个按钮后,两个定时任务会同时运行,分别读取两个列表的随机值修改背景色,就会出现两个列表同步被处理的现象。
另外你原有代码的参数名用了list,这是Python的内置类型名,建议修改为自定义名称避免冲突。
解决方案
如果你的需求是每次点击按钮后,仅运行当前传入列表的处理逻辑,停掉之前的旧任务,可以通过存储after任务ID,每次新调用时先取消旧任务实现,修改后的代码如下:
from tkinter import * import random w = Tk() # 存储当前正在运行的after任务ID,初始为None current_after_id = None list_1 = ["blue", "cyan", "white"] list_2 = ["red", "purple", "black"] def sample_function(target_list): global current_after_id # 先取消之前的定时任务 if current_after_id is not None: w.after_cancel(current_after_id) w.configure(bg=random.choice(target_list)) # 保存新生成的任务ID current_after_id = w.after(500, lambda: sample_function(target_list)) Button(text="List 1", command=lambda: sample_function(list_1)).pack() Button(text="List 2", command=lambda: sample_function(list_2)).pack() w.mainloop()
如果你需要多个列表的处理任务同时独立运行,只需要为每个列表单独分配一个任务ID存储变量,分别控制启停即可。
内容的提问来源于stack exchange,提问作者newfile.py
相关产品推荐
相关产品推荐

