使用"指针"更新tkinter小部件参数

时间:2017-10-24 17:10:04

标签: python pointers variables tkinter parameters

如果我使用参数tkinter.Label而不是fg = PRIMARY_COLOR创建.pack(),如果我更改PRIMARY_COLOR变量的值,请调用.update()方法小部件,前景色不会改变。我知道,为什么会发生这种情况,但我能以某种方式做到,小部件会改变PRIMARY_COLOR变量的前景颜色吗?我可以制作某种"指针"?

2 个答案:

答案 0 :(得分:1)

不,你不能做你想做的事。您需要调用使用该颜色的每个窗口小部件的configure方法。

答案 1 :(得分:1)

正如布莱恩所说,你不能完全你想要什么,但你可以接近。

下面的代码使用StringVar的.trace方法在StringVar发生更改时更改Label颜色。它使用一个Entry来改变StringVar,但你没有来使用Entry:只要StringVar被设置为一个新值,回调就会改变“hello”标签的配置。您可以输入标准颜色名称,如“红色”或十六进制代码,如“#ff8800”。

import tkinter as tk

root = tk.Tk()

label = tk.Label(root, text='hello')
label.pack()

# A StringVar that changes the Label color whenever its value is changed
label_color = tk.StringVar()
label_color.trace("w", lambda *args: label.config(fg=label_color.get()))

# An Entry where we can specify the new color
tk.Label(root, text='Enter a color name or hex number').pack()
e = tk.Entry(root)
e.pack()

# Set the StringVar to the string that the user just entered
def set_colorstring(evt):
    s = evt.widget.get()
    if s:
        label_color.set(s)

e.bind("<Return>", set_colorstring)

root.mainloop()

可能使用这种技术来更改多个小部件的配置,但你必须明确地做(例如循环回调中的小部件列表)。不幸的是,您不能只将fg属性设为StringVar并让它自动更新颜色。