2017-09-28 1 views
1

J'ai écrit le code suivant pour créer 4 boutons et après avoir cliqué sur un bouton la couleur de fond de ce bouton change et quand je clique sur un autre la couleur de celui-ci change maintenant et la couleur de l'ancien est en train de revenir à la couleur par défaut. Cela fonctionne plutôt bien mais le codage n'est pas efficace. Je pense à une boucle qui traverse tous mes boutons pour définir tous les boutons qui ne sont pas actifs à la couleur par défaut. Comment puis-je accomplir cela?Looping à travers les boutons dans tkinter

from tkinter import * 


def update_Button(number): 
    if number == 1: 
    Button_1["background"] = Button_1["activebackground"] = "lightblue" 
    Button_2.configure(background="SystemButtonFace") 
    Button_3.configure(background="SystemButtonFace") 
    Button_4.configure(background="SystemButtonFace") 
    elif number == 2: 
    Button_2["background"] = Button_2["activebackground"] = "lightblue" 
    Button_1.configure(background="SystemButtonFace") 
    Button_3.configure(background="SystemButtonFace") 
    elif number == 3: 
    Button_3["background"] = Button_3["activebackground"] = "lightblue" 
    Button_2.configure(background="SystemButtonFace") 
    Button_1.configure(background="SystemButtonFace") 
    Button_4.configure(background="SystemButtonFace") 
    elif number == 4: 
    Button_4["background"] = Button_4["activebackground"] = "lightblue" 
    Button_2.configure(background="SystemButtonFace") 
    Button_3.configure(background="SystemButtonFace") 
    Button_1.configure(background="SystemButtonFace") 

    pass 


root = Tk() 

Button_font = ("Calibri", 20, "bold") 
Button_Size = [70, 70] # width, height 
pady = 5 
padx = 5 

Button_1 = Button(root, text="1", font=Button_font, command=lambda: update_Button(1)) 
Button_1.grid(sticky="wens", pady=pady, padx=padx) 

Button_2 = Button(root, text="2", font=Button_font, command=lambda: update_Button(2)) 
Button_2.grid(sticky="wens", pady=pady, padx=padx) 

Button_3 = Button(root, text="3", font=Button_font, command=lambda: update_Button(3)) 
Button_3.grid(sticky="wens", pady=pady, padx=padx) 

Button_4 = Button(root, text="4", font=Button_font, command=lambda: update_Button(4)) 
Button_4.grid(sticky="wens", pady=pady, padx=padx) 

root.mainloop() 

comme suggère de @Mitiku la solution à l'aide d'une liste est la suivante:

def update_Button(number): 
    number = number-1 
    buttons = [Button_1, Button_2, Button_3, Button_4] 
    buttons[number]["background"] = buttons[number]["activebackground"] = "lightblue" 
    for button in buttons: 
    if button == buttons[number]: 
     pass 
    else: 
     button.configure(background="SystemButtonFace") 
    pass 

Répondre

1

Le ci-dessous ce que vous devez réalise:

from tkinter import * 

class App: 
    def __init__(self, root): 
     self.root = root 
     self.number = 4 #change me to get more buttons 
     self.buttons = [] 
     for i in range(self.number): 
      self.buttons.append(Button(self.root, text="Change!", bg="white", command=lambda c=i: self.command(c))) 
      self.buttons[i].pack() 
    def command(self, var): 
     for i in range(self.number): 
      self.buttons[i].configure({"bg": "white", "activebackground": "white"}) 
     self.buttons[var].configure({"bg": "lightblue", "activebackground": "lightblue"}) 

root = Tk() 
App(root) 
root.mainloop() 

Le principal mécanicien intéressant que nous utilisons ici est lambda.

Nous déclarons command=lambda c=i: self.command(c) qui appelons le rappel command avec la valeur de i au moment de la déclaration. Cela signifie que lorsque nous appelons la commande, nous passons à travers la valeur entière de la position du widget Button dans le list.


Sur une note côté, cela peut être accompli beaucoup plus facile avec Radiobutton s. Voir ci-dessous:

from tkinter import * 

class App: 
    def __init__(self, root): 
     self.root = root 
     self.v = IntVar() 
     self.number = 4 #change me to get more buttons 
     self.buttons = [] 
     for i in range(self.number): 
      self.buttons.append(Radiobutton(self.root, text="Change!", bg="white", activebackground="lightblue", selectcolor="lightblue", variable=self.v, indicatoron=0, value=i)) 
      self.buttons[i].pack() 

root = Tk() 
App(root) 
root.mainloop() 
+0

Cela fonctionne parfaitement et est même plus que ce que j'avais en tête. Non, je veux colorer juste un bouton à la fois. Merci beaucoup! – Max2603

+0

"Non, je veux colorer juste un bouton à la fois" que voulez-vous dire? Cela ne fait que colorer un à la fois. –

+0

Je me suis référé à commenter ce qui semble être supprimé. – Max2603