2017-12-08 19 views
-1

私はスケーラブルなカウンタを作ろうとしています。ループ内で定義されたラベルのテキストを変更する

最初のウィンドウで、必要なカウンターの数を入力します。

2番目のウィンドウには、ラベルにラベルを追加するためのラベルとボタンがあります。 _ iは

name 'label_' is not defined 

:しかし、これは私が取得エラーです

from tkinter import * 

root = Tk() 

def newWindow(): 
    window = Toplevel() 
    for i in range(int(textbox.get())): 
     exec("global label"+ str(i)) 
     exec("label" + str(i) + " = Label(window, text = '0')") 
     exec("label" + str(i) + ".grid(row = 0, column = i)") 
     exec("global button"+ str(i)) 
     exec("button" + str(i) + " = Button(window, text = 'Add', command = lambda: setText(label" + str(i) + "))") 
     exec("button" + str(i) + ".grid(row = 1, column = i)") 

def setText(label): 
    label.config(text = str(int(label.cget("text")) + 1)) 

textbox = Entry(root) 
textbox.grid(row = 0) 
submitButton = Button(root, text = "Submit", command = newWindow) 
submitButton.grid(row = 0, column = 1) 

root.mainloop() 

は、ここに私のコードです。

グローバルにしてもこれを解決できませんでした。

お願いします!

+0

完全なエラーメッセージが表示されます。 – mrCarnivore

答えて

0

このようにexecを使用している場合、非常に間違ったことをしています。

単純な解決策は、ウィジェットをリストまたは辞書に追加することです。しかし、この特定のケースでは、ボタンコマンドのどこにでもラベルを参照することはないので、その必要はありません。ここで

は作業例です:

def setText(i): 
    label = labels[i] 
    label.configure(...) 
... 
button = Button(..., command=lambda i=i: setText(i)) 
:あなたは、あなたが、あなたのボタンは、インデックスを渡す可能性があり labelsを利用すると setTextは辞書からウィジェットを取得してもらいたい場合は

from tkinter import * 

root = Tk() 

def newWindow(): 
    global labels 
    window = Toplevel() 
    labels = {} 
    for i in range(int(textbox.get())): 
     label = Label(window, text='0') 
     button = Button(window, text='Add', command = lambda l=label: setText(l)) 

     label.grid(row=0, column=i) 
     button.grid(row=1, column=i) 

     # this allows you to access any label later with something 
     # like labels[3].configure(...) 
     labels[i] = label 

def setText(label): 
    label.config(text = str(int(label.cget("text")) + 1)) 

textbox = Entry(root) 
textbox.grid(row = 0) 
submitButton = Button(root, text = "Submit", command = newWindow) 
submitButton.grid(row = 0, column = 1) 

root.mainloop() 

関連する問題