Tkinter 背景颜色问题
Tkinter background colour issue
我有一个脚本,其中有一个 Tkinter 模块,我想以 3 分钟的间隔更改背景颜色,例如绿色 3 分钟然后橙色然后红色。
我有显示绿色的代码,但无法更改它。
当我在我的代码中创建一个函数时,它会出现一些不同的错误,包括
'root not defined, global name "root" no defined'虽然是。
另外在旁注中,在 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()
放在其他任何地方,我会得到一个我不想要的灰色小 TK 框。
P.S 我知道它设置为 10 秒,这只是为了让我可以测试它
你的代码有(至少)四个问题,但这很难说,因为你没有向我们展示所有的细节。特别是,你似乎从来没有调用 execute
,但我假设这发生在其他地方,可能是通过超级 class...
root
是在 execute
中定义的,因此要在回调函数中访问它,您要么必须将其设为全局,要么成为 dis
实例的成员,或者将其放入回调函数 inside execute
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()
或者使用列表更通用一些
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()
我有一个脚本,其中有一个 Tkinter 模块,我想以 3 分钟的间隔更改背景颜色,例如绿色 3 分钟然后橙色然后红色。 我有显示绿色的代码,但无法更改它。
当我在我的代码中创建一个函数时,它会出现一些不同的错误,包括 'root not defined, global name "root" no defined'虽然是。
另外在旁注中,在 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()
放在其他任何地方,我会得到一个我不想要的灰色小 TK 框。
P.S 我知道它设置为 10 秒,这只是为了让我可以测试它
你的代码有(至少)四个问题,但这很难说,因为你没有向我们展示所有的细节。特别是,你似乎从来没有调用 execute
,但我假设这发生在其他地方,可能是通过超级 class...
root
是在execute
中定义的,因此要在回调函数中访问它,您要么必须将其设为全局,要么成为dis
实例的成员,或者将其放入回调函数 inside executeafter
中的延迟以毫秒为单位,因此使用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()
或者使用列表更通用一些
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()