Python 尝试仅基于变量的值更改tkinter标签的颜色

Python 尝试仅基于变量的值更改tkinter标签的颜色,python,tkinter,Python,Tkinter,我知道如何使用附加到按钮的命令来更改标签的颜色,但我希望根据变量的值以编程方式进行更改 如果向build_window功能发送了错误消息,我希望在红色背景的标签上显示错误消息,如果发送了非错误消息,则不会显示任何消息,也不会发生颜色变化 在我的代码中,我调用函数构建tkinter窗口两次。 第一次,我传递了一条非错误消息,第二次,传递了一条错误消息 我的代码用于在需要时显示错误消息,问题只是更改错误消息标签的背景颜色 如果我对显示的l1.config(bg=“red”)命令取消注释,则在将错误消

我知道如何使用附加到按钮的命令来更改标签的颜色,但我希望根据变量的值以编程方式进行更改

如果向
build_window
功能发送了错误消息,我希望在红色背景的标签上显示错误消息,如果发送了非错误消息,则不会显示任何消息,也不会发生颜色变化

在我的代码中,我调用函数构建tkinter窗口两次。 第一次,我传递了一条非错误消息,第二次,传递了一条错误消息

我的代码用于在需要时显示错误消息,问题只是更改错误消息标签的背景颜色

如果我对显示的
l1.config(bg=“red”)
命令取消注释,则在将错误消息传递到
build\u window()时会出现此错误。

UnboundLocalError:赋值前引用了局部变量“l1”

l1.config(bg=“red”)
命令上

如果将整个If结构移动到刚好在
mainloop()
之前,则即使在传递非错误消息时也会出现此错误:

UnboundLocalError:赋值前引用的局部变量“error\u message”

l1=标签(root,text=错误消息)
命令上

如果我将
global l1
global error\u message
添加到
build\u window()
,我得到的错误如下:

tkinter.TclError:无效的命令名“!label”

我也尝试过用“代码”> BG=“红色”< /代码>来定义标签,希望当我发送一个零长度字符串时,它仍然是灰色的,但是它在L1标签的中间显示了一点红色。

我编写简单python已经有一段时间了,但我对GUI应用程序还不熟悉,tkinter每次尝试都会让我感到困惑

我已经搜索了一个解决方案,但在不使用附加到按钮的命令的情况下,找不到任何解决方案来更改窗口

如有任何建议或澄清,将不胜感激

from tkinter import Tk, IntVar, Label, mainloop, Button

def build_window(incoming_error_message) :

    if incoming_error_message == "initial value" :
        error_message = ""
    else :
        #l1.config(bg="red")
        error_message = incoming_error_message
    
    def quitHandler():
        root.destroy()

    root = Tk()

    l1=Label(root,text = error_message)
    l1.grid(row=0,column=0)

    quitButton = Button(root, text="To end, click here",command=quitHandler)
    quitButton.grid(row=1,column=0)
    
    mainloop()

def call_build_window() :
    
    build_window("initial value")
    build_window("Error!")
        
call_build_window()


一个选项是将标签创建放在条件中,并稍微重新排列周围的代码。我还用
pack
替换了
grid
,并跳过了保留实际上是常量的变量的名称,所有这些更改都是为了使代码保持较小:

from tkinter import Tk, Label, mainloop, Button

def build_window(error_message):
   
    root = Tk()
    
    if error_message == "initial value":
        Label(root, text="").pack()
    else:
        Label(root, text=error_message, bg="red").pack()
            
    def quitHandler():
        root.destroy()

    Button(root, text="To end, click here", command=quitHandler).pack()
    
    mainloop()

def call_build_window():
    
    build_window("initial value")
    build_window("Error!")
        
call_build_window()
当然,这是一个小案例研究,不应该用于构建它。 我认为应该对其进行修改,以便在消息作为第二个参数且始终显示文本的情况下,有一个maybe函数使用指示符。如果采用更面向对象的方法,所有这些都会容易得多。(还要记住,
Tk()
通常只调用一次,并且通过
Toplevel()
创建辅助顶级窗口,请参阅或。)


通过使用
tkinter.ttk
也可以在运行时更改小部件的样式,例如,请参见的答案。

您应该交换一些行,以便在通过
l1.config(…
我尝试移动整个“if”时
l1
(标签变量)存在语句中包含的l1.config一直到mainloop()之前,我得到了错误
UnboundLocalError:assignment之前引用的局部变量“error\u message”
Ah,该死!我忘了我将“text=”更改为“textvariable=”以查看是否有效。我应该用“text=”提交它因为这就是我在帖子中描述的代码!我将把它改回text=这样就不会让未来的读者感到困惑。谢谢你的回复!