鱼C论坛

 找回密码
 立即注册
查看: 90|回复: 2

[已解决]Tkinter 想让第2个按钮颜色交替变换

[复制链接]
发表于 2026-8-7 19:30:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 dragov 于 2026-8-7 19:32 编辑
  1. from tkinter import *
  2. root=Tk()
  3. o=["东","南","西","北"]
  4. p=["red","blue"]
  5. def gyl():
  6.       z=Toplevel(root)
  7.       y=list()
  8.       for i in range(len(o)):
  9.             x=Button(z,text=o[i])
  10.             x.pack()
  11.             y.append(x)
  12.       z.transient(root)
  13.       z.grab_set()
  14.       y[-1].focus_set()
  15.       r=True
  16.       def t():
  17.             global r
  18.             if r:
  19.                   y[1].config(background=p[0])
  20.                   r=False
  21.             else :
  22.                   y[1].config(background=p[1])
  23.                   r=True
  24.             y[1].after(2000,t)
  25.       root.after(5000,t)
  26. Button(root,text="大暴雨",command=gyl).pack()
  27. mainloop()
复制代码



为什么提示 r 没有被定义呢 ?
最佳答案
2026-8-9 21:45:47
  1. from tkinter import *

  2. root = Tk()
  3. directions = ["东","南","西","北"]
  4. color = ["red","blue"]

  5. def gyl():
  6.     window = Toplevel(root)
  7.     direction_buttons = list()
  8.     for i in directions:
  9.         button = Button(window,text=i)
  10.         button.pack()
  11.         direction_buttons.append(button)
  12.     window.transient(root)
  13.     window.grab_set()
  14.     direction_buttons[-1].focus_set()
  15.     flag = True
  16.    
  17.     def t():
  18.         nonlocal flag
  19.         if flag:
  20.             direction_buttons[1].config(background=color[0])
  21.             flag = False
  22.         else:
  23.             direction_buttons[1].config(background=color[1])
  24.             flag = True
  25.         direction_buttons[1].after(2000,t)
  26.    
  27.     root.after(5000,t)
  28.    
  29. Button(root,text="大暴雨",command=gyl).pack()
  30. mainloop()
复制代码

核心错误:你的变量 r(即改后的 flag)不是全局变量,而是定义在一个函数内的局部变量
同时优化了你的变量名和 for 循环逻辑。(写一个有意义的变量名很重要!如果写不出英文变量名请使用汉语拼音。请不要o、p、r、t、x、y、z...排列)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2026-8-7 19:30:30 | 显示全部楼层
鱼油你好!你的代码有几个问题:

  • op 没有定义,导致 len(o) 报错。
  • y 是列表,不能直接调用 configfocus_set
  • r 变量作用域混乱,global r 引用了不存在的全局变量。
  • 你想让“第2个按钮”交替变色,但代码里没有明确创建第二个按钮。


下面是一个简单易懂的修正版,实现两个按钮,第二个按钮每2秒切换一次背景色:


  1. from tkinter import *

  2. root = Tk()

  3. # 第一个按钮
  4. Button(root, text="按钮1").pack()

  5. # 第二个按钮,准备交替变色
  6. btn2 = Button(root, text="按钮2", bg="lightblue")
  7. btn2.pack()

  8. # 控制颜色交替的状态
  9. flag = True

  10. def toggle_color():
  11.     global flag
  12.     if flag:
  13.         btn2.config(bg="orange")
  14.         flag = False
  15.     else:
  16.         btn2.config(bg="lightblue")
  17.         flag = True
  18.     # 每隔2000毫秒(2秒)再次调用自己
  19.     btn2.after(2000, toggle_color)

  20. # 启动交替
  21. btn2.after(2000, toggle_color)

  22. mainloop()
复制代码


这段代码中,btn2 就是第二个按钮,toggle_color 函数负责切换颜色,并通过 after 实现循环定时。你可以直接运行试试看!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-8-9 21:45:47 | 显示全部楼层    本楼为最佳答案   
  1. from tkinter import *

  2. root = Tk()
  3. directions = ["东","南","西","北"]
  4. color = ["red","blue"]

  5. def gyl():
  6.     window = Toplevel(root)
  7.     direction_buttons = list()
  8.     for i in directions:
  9.         button = Button(window,text=i)
  10.         button.pack()
  11.         direction_buttons.append(button)
  12.     window.transient(root)
  13.     window.grab_set()
  14.     direction_buttons[-1].focus_set()
  15.     flag = True
  16.    
  17.     def t():
  18.         nonlocal flag
  19.         if flag:
  20.             direction_buttons[1].config(background=color[0])
  21.             flag = False
  22.         else:
  23.             direction_buttons[1].config(background=color[1])
  24.             flag = True
  25.         direction_buttons[1].after(2000,t)
  26.    
  27.     root.after(5000,t)
  28.    
  29. Button(root,text="大暴雨",command=gyl).pack()
  30. mainloop()
复制代码

核心错误:你的变量 r(即改后的 flag)不是全局变量,而是定义在一个函数内的局部变量
同时优化了你的变量名和 for 循环逻辑。(写一个有意义的变量名很重要!如果写不出英文变量名请使用汉语拼音。请不要o、p、r、t、x、y、z...排列)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-9-20 07:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表