Несколько кнопок для изменения цвета нескольких меток TKINTER, PYTHON? - PullRequest
0 голосов
/ 24 апреля 2018

Итак, у меня есть несколько кнопок

, и мне нужны кнопки с каждым именем: т.е. фиолетовая кнопка для поворота ЭТИКЕТКА над ним фиолетовая и фиолетовая кнопка, чтобы превратить вышеуказанную ЭТИКЕТКУ фиолетовую.

И кнопка сброса сбрасывает их все до серый .

И если бы кто-то мог исправить мой код так, чтобы интервал между кнопкой «СБРОС» находился между фиолетовым и синим (но все же на ряд вниз), это было бы очень полезно.

ЧТОМОЙ КОД СЕЙЧАС: Он превращает все коробки во все цвета.Как сделать так, чтобы, когда я нажимал одну кнопку, одна метка меняла цвет, и я хотел бы сделать это в одной функции, если это возможно (я уже думал о создании нескольких функций и думал, что это будет лучше).

Импорт функций 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 голосов
/ 24 апреля 2018

У вас есть много кода, который вы копируете / вставляете.Компьютеры действительно хороши в повторении вещей с изменением нескольких переменных.Вы можете утверждать, что это ВСЕ, в чем компьютер хорош.Делая это самостоятельно, вы выполняете работу компьютера.Кроме того, вы делаете больше работы для себя, если хотите что-то изменить позже.Гораздо лучше размещать вещи в одном месте, так что вы можете внести одно изменение позже, а не для каждого ярлыка.Я вижу, вы уже немного подумали об этом, поскольку у вас так много констант.Чтобы сделать еще один шаг вперед, нужно создать «постоянный» виджет, из которого копируются все ваши экземпляры.Это немного продвинуто, но вот как вы это сделаете:

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

Непосредственным преимуществом является то, что для добавления или вычитания цветов из моей версии вам нужно изменить только одну строку.Кроме того, если вы хотите изменить внешний вид, скажем, добавить рельеф или поменять кнопку на флажок, опять же, вам нужно изменить только одну строку.Подклассы, подобные этому, являются огромной частью дизайна графического интерфейса, я рекомендую вам вникнуть в это как можно скорее.

0 голосов
/ 24 апреля 2018

Это должно делать то, что вы хотите:

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