多个按钮可以更改多个标签的颜色TKINTER,PYTHON?

时间:2018-04-24 15:19:14

标签: python python-3.x button tkinter label

所以我有多个按钮

我需要每个名字的按钮: 即Violet按钮将其上方的 LABEL 变为紫色, 和紫色按钮打开上面的 LABEL 紫色。

并且重置按钮将它们全部重置为灰色

如果有人可以修复我的代码,那么" RESET"按钮位于紫色和蓝色之间(但仍然是一行),非常感谢。

我的代码现在是什么: 它将所有盒子都变成了所有颜色。 当我按下一个按钮时,如何做到这一点,一个标签会改变颜色,如果可能的话,我希望在一个功能中这样做(我已经考虑过制作多个功能,并认为这样会更好)。

导入Tkinter功能

from tkinter import *

# Create a window
the_window = Tk()


# Give the window a title
the_window.title('MULTI Button Colour')

#Variables
window_font = ('Arial', 8)
button_size = 10
label_size = 7

margin_size_width = 10
margin_size_height = 2

label_violet = Label(the_window, padx = margin_size_width, pady = margin_size_height, bg = 'grey', width = label_size)
label_violet.grid(row = 0, column = 0)
label_purple = Label(the_window, padx = margin_size_width, pady = margin_size_height, bg = 'grey', width = label_size)
label_purple.grid(row = 0, column = 1)
label_blue = Label(the_window, padx = margin_size_width, pady = margin_size_height, bg = 'grey', width = label_size)
label_blue.grid(row = 0, column = 2)
label_green = Label(the_window, padx = margin_size_width, pady = margin_size_height, bg = 'grey', width = label_size)
label_green.grid(row = 0, column = 3)

def change_colour():
if violet_button:
    label_violet['bg'] = 'violet'
if purple_button:
    label_purple['bg'] = 'purple'
if blue_button:
    label_blue['bg'] = 'blue'
if green_button:
    label_green['bg'] = 'green'
# if reset_button:
#     label_violet['bg'] = 'grey'
#     label_purple['bg'] = 'grey'
#     label_blue['bg'] = 'grey'
#     label_green['bg'] = 'grey'


violet_button = Button(the_window, text = 'Violet', width = button_size,
                        font = window_font, command = change_colour)
purple_button = Button(the_window, text = 'Purple', width = button_size,
                        font = window_font, command = change_colour)
blue_button = Button(the_window, text = 'Blue', width = button_size, 
                        font = window_font, command = change_colour)
green_button = Button(the_window, text = 'Green', width = button_size,
                        font = window_font, command = change_colour)
reset_button = Button(the_window, text = 'RESET', width = button_size,
                        font = window_font, command = change_colour)
#----------------------------------------------------------------

violet_button.grid(row = 1, column = 0, padx = margin_size_width, pady = margin_size_height)
purple_button.grid(row = 1, column = 1, padx = margin_size_width, pady = margin_size_height)
blue_button.grid(row = 1, column = 2, padx = margin_size_width, pady = margin_size_height)
green_button.grid(row = 1, column = 3, padx = margin_size_width, pady = margin_size_height)
reset_button.grid(row = 2, column = 1, pady = margin_size_height)
# Start the event loop to react to user inputs
the_window.mainloop()

2 个答案:

答案 0 :(得分:1)

这应该做你想要的:

def get_function(cmd):
    def change_colour():
        if 'violet' == cmd:
            label_violet['bg'] = 'violet'
        if 'purple' == cmd:
            label_purple['bg'] = 'purple'
        if 'blue' == cmd:
            label_blue['bg'] = 'blue'
        if 'green' == cmd:
            label_green['bg'] = 'green'
        if 'reset' == cmd:
            label_violet['bg'] = 'grey'
            label_purple['bg'] = 'grey'
            label_blue['bg'] = 'grey'
            label_green['bg'] = 'grey'
    return change_colour


violet_button = Button(the_window, text = 'Violet', width = button_size,
                        font = window_font, command = get_function('violet'))
purple_button = Button(the_window, text = 'Purple', width = button_size,
                        font = window_font, command = get_function('purple'))
blue_button = Button(the_window, text = 'Blue', width = button_size,
                        font = window_font, command = get_function('blue'))
green_button = Button(the_window, text = 'Green', width = button_size,
                        font = window_font, command = get_function('green'))
reset_button = Button(the_window, text = 'RESET', width = button_size,
                        font = window_font, command = get_function('reset'))

对于重置按钮的问题,只需指定网格函数的columnspan参数:

reset_button.grid(row = 2, column = 1, pady = margin_size_height, columnspan = 2)

答案 1 :(得分:1)

你有很多代码可以复制/粘贴。计算机非常善于重复改变一些变量。你可能会说,所有的电脑都擅长。所以,通过自己做,你正在做计算机的工作。此外,如果您想稍后更改某些内容,那么您将为未来的自我做更多的工作。将东西放在一个位置会好得多,这样您可以在以后进行一次更改,而不是为每个标签进行更改。因为你有很多常数,我可以看到你已经考虑过这个了。更进一步的是做一个"常数"所有实例都从中复制的小部件。它有点先进,但是你可以这样做:

import tkinter as tk

# Constants (aka variables that don't change during the program run)
BUTTON_SIZE = 10
FONT=('Arial', 8)

class Corey(tk.Frame):
    '''a new widget that combines a Label and a Button'''
    instances = []
    def __init__(self, master=None, color='grey', **kwargs):
        tk.Frame.__init__(self, master, **kwargs)
        self.color = color
        self.lbl = tk.Label(self, bg=color) # set initial color
        self.lbl.grid(sticky='nsew') # sticky makes the label as big as possible
        btn = tk.Button(self, text=color.title(), width=BUTTON_SIZE, command=self.colorize, font=FONT)
        btn.grid()
        self.instances.append(self)

    def colorize(self):
        self.lbl.config(bg=self.color)

    @classmethod
    def reset(cls):
        for widget in cls.instances:
            widget.lbl.config(bg='grey')

# Create a window
the_window = tk.Tk()

# Give the window a title
the_window.title('MULTI Button Colour')

# make some Corey widgets
colors = 'violet', 'purple', 'blue', 'green'
for col, color in enumerate(colors):
    widget = Corey(the_window, color)
    widget.grid(row=0, column=col, padx=10, pady=2)

reset_button = tk.Button(the_window, text = 'RESET', width=BUTTON_SIZE, command=Corey.reset, font=FONT)
reset_button.grid(row=1, column=0, columnspan=len(colors), pady=4)

the_window.mainloop()

直接的好处是,为了从我的版本中添加或减去颜色,您只需要更改一行。此外,如果要更改外观,例如添加浮雕或将按钮更改为复选框,则只需更改一行。像这样的子类是GUI设计的一个重要部分,我建议你尽快跳到这个。