簡體   English   中英

多個按鈕可更改多個標簽TKINTER,PYTHON的顏色?

[英]Multiple Buttons to change the colours of multiple labels TKINTER, PYTHON?

所以我有多個按鈕

我需要每個名稱的按鈕:紫羅蘭色按鈕將其上方的標簽變成紫羅蘭色,紫色按鈕將上述LABEL變為紫色。

AND重置按鈕將它們全部重置為灰色

並且,如果有人可以修復我的代碼,使“重置”按鈕的間距介於紫色和藍色之間(但仍向下一行),將不勝感激。

我的代碼現在可以做什么:它將所有盒子變成所有顏色。 我如何做到這一點,當我按下一個按鈕時,一個標簽會更改顏色,並且我希望在一個功能中盡可能地做到這一點(我已經想到了做多個功能,並且認為這樣會更好)。

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

這應該做您想要的:

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)

您在其中復制/粘貼了很多代碼。 計算機確實擅長重復更改一些變量的事情。 您可能會爭辯說,一台計算機最擅長的就是它。 因此,您自己做,就可以完成計算機的工作。 此外,如果您以后想要更改某些東西,那么您會為自己的未來做更多的工作。 最好將事物放在一個位置,這樣以后您就可以進行單個更改,而不是為每個標簽都進行更改。 我可以看到您已經考慮了這個問題,因為您有很多常量。 進一步邁出的一步是制作一個“常量”窗口小部件,所有實例都將復制自該窗口小部件。 這有點先進,但是您可以按照以下方式進行操作:

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設計的重要組成部分,我建議您盡快加入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM