正确的方式来不断更新Tkinter Canvas项目的颜色

时间:2014-08-05 04:13:53

标签: 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)
        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 我不确定如何连续循环运行以更改颜色,同时能够通过单击按钮启动和停止循环。

1 个答案:

答案 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功能,因为它不需要在那里。