首页 > 解决方案 > Tkinter 背景换色器

问题描述

我对 tkinter 很陌生。我正在尝试创建一个 tkinter 应用程序,其中有一个显示“开始换色器”的按钮,然后我的 tkinter 应用程序的背景会更改其背景。该部分工作正常,但我对其进行了编码,以便当您单击“开始换色器”时,背景会不断变化,并出现一个新按钮,上面写着“停止换色器”。我认为停止换色器是问题,因为当我单击“停止换色器”时,换色器会继续运行!请你帮帮我。

这是我的代码:

from tkinter import *

root = Tk()

def opposite_of_get_colour():
    colours2 = ['white']
    for colour in colours2:
        while True:
            yield colour


def get_colour():
    colours = ['#e0ffff', '#7FDBFF', '#01FF70', '#FFFFFF', '#DDDDDD', '#AAAAAA', '#FF851B']
    while True:
        for c in colours:
            yield c


def start():
    stopButton = Button(root, text = "Stop colour changer", command = stop)
    stopButton.grid(row = 8, column = 0)
    root.configure(background=next(colour_getter))
    root.after(1000, start) # run this function again after 1000ms
colour_getter = get_colour()

startButton = Button(root, text="Start colour changer",command=start)
startButton.grid(row = 7, column = 0)

def stop():
    root.configure(background=next(no_colour_getter))
    new_stop_button = Button(root, text = "Stop coour change.", state = DISABLED)
    new_stop_button.grid(row = 8, column = 0)
no_colour_getter = opposite_of_get_colour()


root.mainloop()

标签: tkinter

解决方案


成功的after()调用将返回一个取消 ID。这可用于通过调用来停止计划函数的运行after_cancel()

这是使用您的代码的示例:

from tkinter import *

root = Tk()

def opposite_of_get_colour():
    colours2 = ['white']
    for colour in colours2:
        while True:
            yield colour


def get_colour():
    colours = ['#e0ffff', '#7FDBFF', '#01FF70', '#FFFFFF', '#DDDDDD', '#AAAAAA', '#FF851B']
    while True:
        for c in colours:
            yield c


def start():
    stopButton = Button(root, text = "Stop colour changer", command = stop)
    stopButton.grid(row = 8, column = 0)
    root.configure(background=next(colour_getter))
    # define global variable so other functions can access the current id
    # if using classes, you might want to use an instance variable for this
    global id 
    # store the current id
    id = root.after(1000, start) # run this function again after 1000ms

colour_getter = get_colour()

startButton = Button(root, text="Start colour changer", command=start)
startButton.grid(row = 7, column = 0)

def stop():
    root.configure(background=next(no_colour_getter))
    new_stop_button = Button(root, text = "Stop colour change.", state = DISABLED)
    new_stop_button.grid(row = 8, column = 0)
    # cancel invoking the callback with the latest id
    root.after_cancel(id)
    
no_colour_getter = opposite_of_get_colour()

root.mainloop()

推荐阅读