【问题标题】:Trying to change the color of a tkinter label based solely on the value of a variable尝试仅根据变量的值更改 tkinter 标签的颜色
【发布时间】:2021-08-06 11:39:07
【问题描述】:

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

如果向build_window函数发送错误消息,我想在带有红色背景的标签上显示错误消息,如果发送非错误消息,则不显示消息且没有颜色预计会有变化。

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

我的代码用于在预期时显示错误消息,问题仅在于更改错误消息标签的背景颜色。

如果我取消注释显示的l1.config(bg="red") 命令,则在将错误消息传递给build_window() 时会收到此错误:

UnboundLocalError: local variable 'l1' referenced before assignment

l1.config(bg="red") 命令上。

如果我将整个 if 结构移动到 mainloop() 之前,即使在传递非错误消息时也会收到此错误:

UnboundLocalError: local variable 'error_message' referenced before assignment

l1=Label(root,text = error_message) 命令上。

如果我将global l1global error_message 添加到build_window(),我得到的错误是这样的:

tkinter.TclError: invalid command name ".!label"

我也试过最初用bg="red"定义标签,希望当我发送一个长度为零的字符串时,它仍然是灰色的,但它在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()

【问题讨论】:

  • 您应该交换一些行,以便在通过l1.config(... 访问它时存在l1(标签变量)
  • 我尝试将包含 l1.config 的整个“if”语句移到 mainloop() 之前,我收到了错误 UnboundLocalError: local variable 'error_message' referenced before assignment
  • 啊,该死的!我忘记了我将“text=”更改为“textvariable=”以查看是否有效。我应该用“text=”提交它,因为那是我在帖子中描述的代码!
  • 我将它改回 text= 这样它就不会混淆未来的读者。感谢您的回复狼!

标签: python tkinter


【解决方案1】:

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

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()

这当然是一个小型案例研究,不应以此为基础。 我认为应该对其进行重新设计,以便如果消息作为第二个参数并且始终显示文本,则可能有一个函数可以获取指示符。在更加面向对象的方法中,这一切都会变得容易得多。 (还要记住,Tk() 通常只调用一次,二级顶层窗口是通过Toplevel() 创建的,参见Python - Tkinter - invisible text in ttk.Entry in sub windowtkinter: Open a new window with a button prompt。)

通过使用tkinter.ttk,还可以在运行时更改小部件的样式,例如,请参阅Changing ttk widget text color 的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-08
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多