2016-12-29 6 views
1

In meiner GUI-Anwendung erstelle ich eine Schaltfläche für jedes Element in einer bestimmten Liste. Wenn eine Taste gedrückt wird, wird der Hintergrund der Taste grün und erscheint als "abgesunken". Die anderen Schaltflächen erscheinen erhöht und mit der Standardfarbe. Mein Problem ist, dass nur die zuletzt erstellte Schaltfläche Farbe und Aussehen ändert. Ich glaube, das liegt daran, dass es die Callback-Funktion enthält.Ändern der Schaltfläche Aussehen On Click

Ich wünsche, dass nach dem ersten Drücken der Taste, wenn ein Benutzer eine andere Taste drückt, dass die neue Schaltfläche grün und erscheint versunken und die vorherige Schaltfläche wird erhöht und die Standardfarbe. Meine Vermutung ist, dass ich eine Liste aller erstellten Schaltflächen erstellen und Logik in der Rückruffunktion für mein gewünschtes Verhalten anwenden muss. Aber wie?

+0

Ich weiß, dass der Standard-Hintergrund Die Farbe eines Knopfes ist hellgrau. – Astrodude11

+0

nach 'for-loo' Variable' btn' behält nur die letzte Taste, also benutzt 'btn.config' nur die letzte Taste. – furas

+0

diese Elemente haben nichts mit dem Problem zu tun, aber nächstes Mal nicht Frage ändern, weil andere lesen, Frage und Kommentar und sie verstehen möglicherweise nicht, was vor sich geht. Bessere Erklärungen/Modifikationen unter der Originalversion. – furas

Antwort

2

Es war so viele Male auf Stackoverflow, also weiß ich nicht, ob ich es noch einmal schreiben sollte.

Button hat command=, um Funktion zuzuweisen, aber es kann Funktion ohne Argumente zuweisen. Wenn Sie mit Argumenten benötigen, müssen Sie lambda verwenden. Ich weise Funktion mit Bezug auf Knopf zu, so kann Funktion korrekten Knopf verwenden und es ändern.

lambda in for-loop Bedürfnissen arg=btn und select_button(arg) weil direkte select_button(btn) letzte Taste in allen Funktionen nutzen werden.


Wie bei vorherigen Schaltfläche Originalfarbe ändern Sie Variable verwenden können previusly geklickt Taste merken und dann können Sie diese leicht Farbe ändern.

Problem kann sein, oryginal Farbe des Knopfes zu finden, also kopiere ich es von neuem geklicktem Knopf.

import tkinter as tk 

# --- functions --- 

def select_button(widget): 
    global previously_clicked 

    if previously_clicked: 
     previously_clicked['bg'] = widget['bg'] 
     previously_clicked['activebackground'] = widget['activebackground'] 
     previously_clicked['relief'] = widget['relief'] 

    widget['bg'] = 'green' 
    widget['activebackground'] = 'green' 
    widget['relief'] = 'sunken' 

    previously_clicked = widget 

# --- main --- 

names = ['Button A', 'Button B', 'Button C'] 

root = tk.Tk() 

previously_clicked = None 

for i, name in enumerate(names, 2): 
    btn = tk.Button(root, text=name) 

    btn.config(command=lambda arg=btn:select_button(arg)) 
    #btn['command'] = lambda arg=btn:select_button(arg) 

    btn.grid(row=i, column=0, sticky='w') 

root.mainloop() 

EDIT: Sie auch Radiobutton mit einigen Optionen verwenden können, das gleiche zu tun - und ohne Funktion:

siehe: http://effbot.org/tkinterbook/radiobutton.htm

import tkinter as tk 

# --- functions --- 

def select_button(): 
    print('value:', v.get()) # selected value 

# --- main --- 

names = ['Button A', 'Button B', 'Button C'] 

root = tk.Tk() 

v = tk.IntVar() # variable for selected value 

for i, name in enumerate(names, 2): 
    btn = tk.Radiobutton(root, text=name, variable=v, value=i) # assign variable and value 

    btn['indicatoron'] = 0 # display button instead of radiobutton 
    btn['selectcolor'] = 'green' # color after selection 

    btn['command'] = select_button # function without variables 

    btn.grid(row=i, column=0, sticky='w', ipadx=5, ipady=5) 

root.mainloop() 
+0

Ja, das ist eine häufige Frage, aber mein Fall ist anders. Wie ändere ich das Aussehen der ursprünglichen Schaltfläche, nachdem eine neue Schaltfläche gedrückt wurde? Diese erste Schaltfläche sollte in den ursprünglichen Zustand versetzt werden. – Astrodude11

+0

jetzt sehe ich, was Sie brauchen. - Sie können die Variable verwenden, um sich an zuvor geklickte Schaltfläche zu erinnern, und dann können Sie sie in origineal Wert ändern. – furas

+0

Ich habe den Code geändert. – furas