我试图弄清楚如何连续改变矩形的颜色,每次改变之间有一秒。现在我有这个简单的功能,它在一个按钮上方形成一个正方形的窗口,在每次点击按钮后改变正方形的颜色:
def junk():
def random_color():
red = int(random.random()*256)
green = int(random.random()*256)
blue = int(random.random()*256)
return '#' + ('{:0>#02X}'*3).format(red,green,blue)
def change_color():
c.itemconfig(r, fill=random_color())
x = Tkinter.Tk()
c = Tkinter.Canvas(master=x)
c['width'] = 400; c['height'] = 400
r = c.create_rectangle(0,0,400,400)
b = Tkinter.Button(master=x, command=change_color)
b['text'] = 'change color'
c.pack(); b.pack(); x.mainloop()
我想要的是能够单击一次,然后自动更改颜色。我知道我想使用CheckButton
代替Button
,因此只需点击一下即可启动循环,然后下一次点击即可停止循环。
此外,这不是我构建我的"真实"代码,这是我从IDLE shell测试的方式。在junk
函数中定义辅助函数可以很容易地立即获取所有相关代码,而不会产生完整类的膨胀。所以请不要给我评论风格,这是有目的的快速和肮脏。
TL; DR 我不确定如何连续循环运行以更改颜色,同时能够通过单击按钮启动和停止循环。
答案 0 :(得分:0)
我明白了。在我展示我的解决方案之前,我想纠正我在上面做出的错误陈述:我没有使用Checkbutton
来完成这项工作。我可以通过更改“缓解”按钮将正常按钮设置为切换按钮。按钮的选项。这是我的解决方案:
def junk():
def color_poll():
global alarm
c.itemconfig(r, fill=random_color())
if keep_going:
alarm = c.after(1000, color_poll)
def change_color():
global keep_going, alarm
if not keep_going:
keep_going = True
b['text']='STOP';b['fg']='red';b['relief']=Tkinter.SUNKEN
color_poll()
else:
keep_going = False; c.after_cancel(alarm); alarm = None
b['text']='GO';b['fg']='green';b['relief']=Tkinter.RAISED
x = Tkinter.Tk()
c = Tkinter.Canvas(master=x)
c['width'] = 400; c['height'] = 400
r = c.create_rectangle(0,0,400,400)
global keep_going, alarm
keep_going = False; alarm = None
b = Tkinter.Button(master=x, command=change_color)
b['text'] = 'GO';b['fg']='green';b['font']='Arial 16';b['relief']=Tkinter.RAISED
c.pack(); b.pack(); x.mainloop()
我使用相同的random_color
功能,但我将其移出,因为它不属于junk
功能,因为它不需要在那里。