2016-12-29 6 views
1

私のGUIアプリケーションでは、指定されたリストのすべての項目のボタンを作成します。ボタンを押すと、そのボタンの背景が緑色に変わり、「沈んだ」と表示されます。他のボタンは上げて表示され、デフォルトの色で表示されます。私の問題は、作成された最後のボタンだけが色と外観を変更することです。私はこれがコールバック関数を含んでいると信じています。クリック時にボタンの外観を変更する

最初のボタンを押した後に、新しいボタンが緑色に変わって窪んで表示され、前のボタンが上がってデフォルトの色になるという別のボタンを押したければ、私の推測では、作成されたすべてのボタンのリストを作成し、それに必要な動作のためにコールバック関数でロジックを適用する必要があるということです。しかし、どうですか?

+0

私が知っているデフォルトの背景そのボタンの色は薄い灰色です。 – Astrodude11

+0

'for-loo'変数の後に' btn'は最後のボタンだけを保持していますので、 'btn.config'を使って最後のボタンだけを変更します。 – furas

+0

この要素は問題とは関係ありませんが、次回は質問を変更しないでください。他の質問やコメントを読んで、何が起こっているのか理解できない可能性があります。元のバージョンの下に問題の説明/修正を追加する方が良い。 – furas

答えて

2

Stackoverflowには何度もあったので、もう一度書き込む必要があるかどうかわかりません。

Buttonは、機能を割り当てるのにcommand=ですが、引数なしで機能を割り当てることができます。引数が必要な場合は、lambdaを使用する必要があります。私はボタンを参照して関数を割り当てるので、関数は正しいボタンを使用してそれを変更することができます。

lambdafor-loopにおけるニーズarg=btnselect_button(arg)直接select_button(btn)は、すべての機能で最後のボタンを使用しますので。


以前のボタンを元の色に変更すると、変数を使用して以前にクリックされたボタンを覚えてから、簡単に色を変更することができます。

問題は、クリックした新しいボタンからコピーするようにボタンの輪郭の色を見つけることができます。

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:あなたも同じことを行うためにいくつかのオプションでRadiobuttonを使用することができます - と機能なし:

参照: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

はい、これはよくある質問ですが、私のケースは異なります。新しいボタンを押した後、最初のボタンの外観を変更するにはどうすればよいですか?この初期ボタンは元の状態に設定する必要があります。 – Astrodude11

+0

今、私はあなたが必要とするものを見ます。あなたは以前にクリックされたボタンを覚えている変数を使用することができますし、あなたはそれを奇妙な値に変更することができます。 – furas

+0

コードが変更されました。 – furas

関連する問題