9

我有一个简单的 tkinter 窗口。它由一个小窗口、一个计时器和一个设置计时器的按钮组成。我不想详细介绍代码。

我想更改窗口中所有小部件的背景(按钮、标签等)。

我的第一个想法是使用我将设置的全局变量"red",并将所有小部件background选项与全局变量相关联。然后,在按下按钮时,我将全局变量更改为"green"(以便所有小部件的背景发生变化)但没有任何反应。

我的理解是更新窗口的.mainloop()那种。当我的变量更改而不重新启动我的应用程序时,如何让小部件更改背景颜色?

4

3 回答 3

8

从我的第一印象来看,我认为这应该是您正在寻找的,作为一个简单的例子

from Tkinter import *

root = Tk()
global colour
global colourselection 
global count 
colour = ""
colourselection= ['red', 'blue']
count = 1

def start(parent):
    Tk.after(parent, 1000, change)

def change():
    global colour 
    global colourselection
    global count 
    if (count < 2 ):
        colour = colourselection[count]
        button.configure(bg = colour)
        count + 1
    else:
        colour = colourselection[count]
        button.configure(bg = colour)
        count = 1 
    start(root)



button = Button(text = 'start', command = lambda: start(root))
button.pack()

root.mainloop()

我相信你可以解决任何问题,它没有经过测试

于 2012-11-27T17:02:26.727 回答
3

背景颜色不会自动改变。Tkinter 有能力用字体而不是颜色来做这样的事情。

您将不得不编写一些代码来遍历所有小部件并更改它们的背景颜色。

于 2012-11-27T18:14:58.927 回答
2

(我在类似问题上发布了这个答案,我认为这也适用于这种情况:)

对于我的生活,我无法仅使用 configure 方法让它工作。最终起作用的是将所需的颜色(在我的情况下为按钮)设置为StringVar()(直接设置为get()),然后也使用按钮上的配置。

我为我最需要的用例写了一个非常通用的示例(这是很多按钮,我需要引用它们(在 Python 2 和 3 中测试):

蟒蛇 3:

import tkinter as tk

蟒蛇2:

import Tkinter as tk

代码

root = tk.Tk()
parent = tk.Frame(root)

buttonNames = ['numberOne','numberTwo','happyButton']
buttonDic = {}
buttonColors = {}

def change_color(name):
    buttonColors[name].set("red")
    buttonDic[name].config(background=buttonColors[name].get())

for name in buttonNames:
    buttonColors[name] = tk.StringVar()
    buttonColors[name].set("blue")
    buttonDic[name] = tk.Button(
            parent,
            text = name,
            width = 20,
            background = buttonColors[name].get(),
            command= lambda passName=name: change_color(passName)
            )

parent.grid(row=0,column=0)
for i,name in enumerate(buttonNames):
    buttonDic[name].grid(row=i,column=0)

root.mainloop()
于 2019-09-20T13:34:05.933 回答