Python 持续更新Tkinter画布项目颜色的正确方法

Python 持续更新Tkinter画布项目颜色的正确方法,python,python-2.7,tkinter,Python,Python 2.7,Tkinter,我试图找出如何连续改变矩形的颜色,每次改变之间间隔一秒钟。现在,我有一个简单的功能,它可以在按钮上方创建一个带有正方形的窗口,每次单击按钮后,该窗口都会更改正方形的颜色: def junk(): def random_color(): red = int(random.random()*256) green = int(random.random()*256) blue = int(random.random()*256)

我试图找出如何连续改变矩形的颜色,每次改变之间间隔一秒钟。现在,我有一个简单的功能,它可以在按钮上方创建一个带有正方形的窗口,每次单击按钮后,该窗口都会更改正方形的颜色:

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来代替按钮,这样一次点击就会启动循环,下一次点击就会停止循环

此外,这不是我构建真实代码的方式,而是我从空闲shell进行测试的方式。在junk函数中定义helper函数可以轻松地一次获取所有相关代码,而不需要整个类的膨胀。所以请不要给我关于风格的评论,这是故意的快速和肮脏


TL;DR我不知道如何让一个连续循环运行以改变颜色,同时能够通过点击按钮启动和停止循环。

我找到了答案。在我展示我的解决方案之前,我想纠正我上面的一个错误陈述:我不想使用复选按钮来实现这一点。我可以通过更改按钮的“释放”选项将普通按钮变成切换按钮。以下是我的解决方案:

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()
我使用了同样的随机颜色函数,但我把它移出了垃圾函数,因为它不需要在那里