Tkinter背景颜色问题

时间:2015-05-13 10:12:57

标签: python tkinter tk tkinter-canvas

我有一个脚本,其中有一个Tkinter模块,我希望以3分钟的间隔更改背景颜色,例如绿色3分钟,然后是橙色,然后是红色。 我有代码显示绿色,但无法更改。

当我在我的代码中创建一个函数时,会出现一些不同的错误,包括 ' root未定义,全局名称" root"没有定义'虽然它是。

另外,在15分钟后杀死Tk显示器,所以一旦所有3种颜色都被杀掉了。

from __future__ import absolute_import
from . import BasePlugin
import os, sys
import time
from Tkinter import *

def Orange (*args,**kwargs):
    root.config(background="Orange")
def Red(*args,**kwargs):
    root.config(background="Red")

class dis(BasePlugin):
       def execute(self, msg, unit, address, when, printer, print_copies):
        mseg = str('%s - %s' % (msg, unit))
        root = Tk()
        root.title('label')
        txt = Label(root, font= 'times 20 bold', bg='Green')
        txt.config(text= mseg)
        txt.pack(fill=BOTH, expand=0)
        root.after(10,Orange)
        root.after(10,Red)

        root.mainloop(0)

PLUGIN = dis

我也试过

from __future__ import absolute_import
from . import BasePlugin
import os, sys
import time
from Tkinter import *

def Orange (*args,**kwargs):
    txt.config(background="Orange")
def Red(*args,**kwargs):
    txt.config(background="Red")

class dis(BasePlugin):
       def execute(self, msg, unit, address, when, printer, print_copies):
        mseg = str('%s - %s' % (msg, unit))
        root = Tk()
        root.title('label')
        txt = Label(root, font= 'times 20 bold', bg='Green')
        txt.config(text= mseg)
        txt.pack(fill=BOTH, expand=0)
        txt.after(10,Orange)
        txt.after(10,Red)

        root.mainloop(0)

PLUGIN = dis

如果我将root = Tk()放在其他任何地方,我会得到一个我不想要的灰色小盒子。

P.S我知道它只设置为10秒,所以我可以测试它

2 个答案:

答案 0 :(得分:3)

您的代码存在(至少)四个问题,但这很难说,因为您没有向我们展示所有细节。特别是,你似乎永远不会打电话给execute,但我会假设这发生在其他地方,也许是通过超级班......

  • rootexecute内定义,因此要在回调函数中访问它,您必须使其成为全局变量,或者是dis实例的成员,或者放回回调函数函数里面执行
  • after中的延迟以毫秒为单位,因此使用10颜色会立即切换,这可能不是最佳的测试设置
  • 目前,两个after回调都在同一时间执行;要么将一个放在另一个回调函数的末尾,要么使用不同的时间
  • 您更改了root面板的背景,而实际上您想要更改txt标签
  • 的背景

例如,您可以尝试这样(最小的独立示例)

class dis:
    def execute(self):
        def orange():
            txt.config(bg="Orange")
            root.after(2000, red)
        def red():
            txt.config(bg="Red")
            root.after(2000, kill)
        def kill():
            root.destroy()
        root = Tk()
        txt = Label(root, text="some text", font='times 20 bold', bg='Green')
        txt.pack(fill=BOTH, expand=0)
        root.after(2000, orange)
        root.mainloop()
dis().execute()

或更短,只需使用一堆lambda

class dis:
    def execute(self):
        root = Tk()
        txt = Label(root, text="some text", font='times 20 bold', bg='Green')
        txt.pack(fill=BOTH, expand=0)
        root.after(2000, lambda: txt.config(bg="Orange"))
        root.after(4000, lambda: txt.config(bg="Red"))
        root.after(6000, root.destroy)
        root.mainloop()
dis().execute()

答案 1 :(得分:1)

或者使用列表更通用

class dis():
    def __init__(self):
        mseg = ("test message")
        self.color_list=["green", "orange", "red"]
        self.ctr=0
        root = Tk()
        root.title('label')
        self.txt = Label(root, font= 'times 20 bold', width=20)
        self.txt.config(text= mseg)
        self.txt.pack(fill=BOTH, expand=0)
        self.change_color()

        root.mainloop()

    def change_color(self):
        self.txt.config(background=self.color_list[self.ctr])
        self.ctr += 1
        if self.ctr > 2:
           self.ctr=0
        self.txt.after(500, self.change_color)

PLUGIN = dis()