2016-11-22 2 views
0

я создал кнопки динамически и установить их вызвать функцию сценария поэтому при щелчке Test 1script_1 выполняется, также Test 2 для script_2 и так далее ... но когда Test 1 или Test 2 щелкают Выполняется script_0. Кажется, val = i.get() всегда возвращает значение 0 каждый раз. Есть ли способ получить текущий i value?ссылающихся функции итерации для динамически создаваемых кнопок Tkinter

функция

def script(): 
    if running: 
     i = IntVar() 
     val = i.get() 
     subprocess.Popen(['python', 'script_' + str(val) + '.py']) 
    root.update() 

Кнопка

for i in range(3): 
    button.append(tk.Button(root, text="Test " + str(i + 1), font=(None, 16), command=lambda i=i: script())) 
    button[-1].grid(column=0, row=i + 1) 

ответ

1

Это потому, что вы инициализировать i линии раньше, и IntVar всегда инициализирует 0. Вам необходимо пройти i в качестве аргумента ваш сценарий:

from Tkinter import Button, IntVar, Tk 
import subprocess 
def script(i): 
    subprocess.Popen(['python', 'script_' + str(i) + '.py']) 
    root.update() 

root = Tk() 
button = [] 
for i in range(3): 
    button.append(Button(root, text="Test " + str(i + 1), font=(None, 16), command=lambda i=i: script(i))) 
    button[-1].grid(column=0, row=i + 1) 

root.mainloop() 

Это правильно всплывает script_0.py, 1 , 2 для меня. Рассмотрите возможность обертывания корня в классе как хорошую практику (некоторые хотели бы наследовать Tk) и сделать кнопки частью __init__.

Смежные вопросы