2017-07-21 18 views
1

私が書いているコードでは、Tkinter UIでボタンを押すとボタンが無効になり、別のボタン現在無効になっているボタンが再度有効になります。Tkinterボタンが無効になっている/有効になっているとき

import tkinter as tk 
from tkinter import ttk 

def btnPressed(index): 
    print("Button {0} disabled".format(index)) 
    for i in range(len(buttons)): 
     print("Button {0}, State: {1}".format(index, buttons[index]['state'])) 
     if buttons[i]['state'] == 'disabled': 
      buttons[i].configure(state = 'normal') 
    buttons[index].configure(state = 'disabled') 


root = tk.Tk() 
buttons = [] 
btn1 = ttk.Button(root, text = "Button 1", command = lambda: btnPressed(0)) 
btn1.pack() 
buttons.append(btn1) 
btn2 = ttk.Button(root, text = "Button 2", command = lambda: btnPressed(1)) 
btn2.pack() 
buttons.append(btn2) 
btn3 = ttk.Button(root, text = "Button 3", command = lambda: btnPressed(2)) 
btn2.pack() 
buttons.append(btn3) 
root.mainloop() 

今すぐボタンを無効にすることができますが、その後は「通常の」状態に戻りません。私はそれがif文をチェックする前に、私はすべてのボタンの現在の状態を見ることができるように、forループで

print("Button {0}, State: {1}".format(index, buttons[index]['state']))

を入れて、いくつかのバグのテストをやってみました。

すべてのボタンは、UI上で無効になっていて、まだ状態値が'normal'です。だから明らかに何かが間違っていますが、私はその何かが何であるか分かりません。

答えて

2

buttons[index]['state']のタイプをチェックすると、<class '_tkinter.Tcl_Obj'>ではなく、stringであることがわかります。これは、if文が必ず失敗することを意味します。実際に比較するには、文字列に変換する必要があります。

if str(buttons[i]['state']) == 'disabled': 

ところで、あなたはすでにforループを使用しています。それを活用してください。そのループにはiは必要ありません。

def btnPressed(index): 
    for btn in buttons: 
     if str(btn['state']) == 'disabled': 
      btn.configure(state = 'normal') 
    buttons[index].configure(state = 'disabled') 
+0

私にはそれをビートしてください。私はちょうど私の答えを投稿しようとしていた:P。 –

+0

ありがとうございました。私はIDLEデバッガを理解できないので、値の型をチェックすることができませんでした。 – Skitzafreak

4

Buttonクラスはtkinterではなくttkから使用しています。状態属性はオブジェクトであり、文字列ではありません。

ttkウィジェットが特定の状態にあるかどうかをテストするには、instateメソッドを使用できます。例:

if buttons[i].instate[["disabled",]]: 
    ... 

また、状態を返すstateメソッドを使用することもできます。 ttkの状態はtkの状態よりも複雑なので、リストを返す。たとえば、buttons[i].state()('disabled',)

を返します。また、インデックスを使用せずにボタンをループすることができますか?コードを読みやすくするでしょう:

for button in buttons: 
    if button['state'] == ... 
関連する問題