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=这样就不会让未来的读者感到困惑。谢谢你的回复!