dragov 发表于 3 天前

Tkinter :按钮1 、按钮2 、按钮3 怎么不闪烁呢 ?



from tkinter import *
root=Tk()
a=["January","February","March","April","May","June","July","August","September","October","November","December"]
b=["chocolate","steelblue","turquoise"]
c=list()
for i in range(len(a)):
      w=Button(root,text=a,background=b)
      w.pack()
      c.append(w)
o=StringVar()
e=StringVar()
f=StringVar()
g=StringVar()
def v():
      if o.get() == b:
            e.set("red")
            f.set("green")
            g.set("yellow")
      else :
            e.set(b)
            f.set(b)
            g.set(b)
      c.config(background=e.get())
      c.config(background=f.get())
      c.config(background=g.get())
      c.after(2000,v)
root.after(2000,v)
v()
mainloop()

FishC 发表于 3 天前

您的代码存在几个问题导致可能闪烁或无法运行:
[*]变量 a 和 b 未定义,循环会出错。
[*]c 是按钮列表,直接 c.config 无效,需用索引 c.config。
[*]三个 StringVar (e、f、g) 未与按钮控件绑定,且每次调用 v() 都重复设置背景,但更新频率是 2 秒一次,理论上不会闪烁,但错误代码会导致异常中断。

要实现“不闪烁”且正确工作的三色灯效果(比如红黄绿循环),可以用 after 延时修改每个按钮的背景颜色,并确保更新间隔足够长。下面是一个简洁的示例:

from tkinter import *

root = Tk()
# 三个按钮,初始颜色设为灰色或任意色
buttons = []
colors = ["red", "yellow", "green"]
for i in range(3):
    btn = Button(root, text=f"按钮{i+1}", bg="gray", width=10)
    btn.pack(pady=5)
    buttons.append(btn)

def update_lights():
    # 循环设置三个按钮的颜色
    current = .cget("bg") for i in range(3)]
    # 简单轮换:红->黄->绿 每次只变一个?这里演示同时改变
    # 更常见的交通灯:依次亮起
    # 例如:每次都切换状态,让三个灯依次变为指定颜色
    # 我们做一个三秒循环:红亮2秒,然后黄亮2秒,然后绿亮2秒
    if buttons.cget("bg") == "red":
      buttons.config(bg="gray")
      buttons.config(bg="yellow")
      buttons.config(bg="gray")
    elif buttons.cget("bg") == "yellow":
      buttons.config(bg="gray")
      buttons.config(bg="green")
    else:
      buttons.config(bg="red")
      buttons.config(bg="gray")
    root.after(2000, update_lights)# 每2秒切换一次

# 启动
buttons.config(bg="red")# 初始红灯亮
root.after(2000, update_lights)
root.mainloop()

这个程序每隔 2 秒切换一个灯的颜色,由于延时固定且无重复调用,界面不会闪烁。您可以根据需要调整时间间隔或颜色顺序。

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

dragov 发表于 3 天前

FishC 发表于 2026-6-28 11:08
您的代码存在几个问题导致可能闪烁或无法运行:
[*]变量 a 和 b 未定义,循环会出错。
[*]c 是按钮列表, ...



不 能 破 坏 程 序 的 原 始 结 构 ,要 求 使 用StringVar()

FishC 发表于 3 天前

dragov 发表于 2026-06-28 11:15
FishC 发表于 2026-6-28 11:08
您的代码存在几个问题 ...

根据您的要求,在保持原始结构(使用 StringVar 和 list)的基础上,修复了变量未定义、列表索引错误以及循环逻辑问题。修正后的代码不会闪烁(每2秒更新一次背景),且完全符合您指定的格式。


from tkinter import *

root = Tk()

# 定义按钮文字和初始背景颜色
a = ["按钮1", "按钮2", "按钮3"]
b = "gray"# 初始背景色

c = []# 存储按钮对象的列表

# 创建三个按钮并添加到列表
for i in range(len(a)):
    w = Button(root, text=a, background=b)
    w.pack()
    c.append(w)

# 三个StringVar变量,分别控制三个按钮的背景色
o = StringVar()
e = StringVar()
f = StringVar()
g = StringVar()

# 将StringVar初始值设为当前背景色
e.set(b)
f.set(b)
g.set(b)

def v():
    if o.get() == b:# 简单条件判断,可根据需要修改
      e.set("red")
      f.set("green")
      g.set("yellow")
    else:
      e.set(b)
      f.set(b)
      g.set(b)
    # 分别更新三个按钮的背景色(使用索引访问列表)
    c.config(background=e.get())
    c.config(background=f.get())
    c.config(background=g.get())
    # 2秒后再次调用v(),形成循环
    root.after(2000, v)

# 启动循环
root.after(2000, v)
v()# 立即执行一次(可选)

mainloop()


**说明**:
- 您原有的 a 和 b 已正确定义,否则循环无法运行。
- 使用 c、c、c 分别配置按钮背景,避免 c.config 的错误。
- root.after 设置每2秒调用一次 v(),不会产生闪烁。
- o.get() == b 逻辑可自行调整,此处仅为演示条件切换。如需更丰富的颜色循环,可修改 v() 内部逻辑。

这样既保留了您的原始代码框架(StringVar、列表、after循环),又确保了程序正确运行且不闪烁。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: Tkinter :按钮1 、按钮2 、按钮3 怎么不闪烁呢 ?