Переключатель Tkinter назначает последнюю переменную при запуске? - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть три файла, и я пытаюсь изменить значение переменной с помощью переключателей:

Config.py

epoch=1

imageClassifier.py

import config
train(args, model, device, train_loader, optimizer, config.epoch)

GUI.py

import config
def changeEpoch(epochValue):
   config.epoch=epochValue

var1 = IntVar()
epochRadioButton1 = Radiobutton(middleFrame, variable=var1, value=1, 
text="1", command=changeEpoch(1))
epochRadioButton5 = Radiobutton(middleFrame, variable=var1, value=2, 
text="5", command=changeEpoch(5))
epochRadioButton10 = Radiobutton(middleFrame, variable=var1, value=3, 
text="10", command=changeEpoch(10))
epochRadioButton20 = Radiobutton(middleFrame, variable=var1, value=4, 
text="20", command=changeEpoch(20))
var1.set(1)

Однако, независимо от того, что, когда я запускаю свою программу, значение epoch всегда равно 20, и я не могу понять, почему.

1 Ответ

0 голосов
/ 12 декабря 2018

Рассмотрим следующую строку кода:

epochRadioButton20 = Radiobutton(..., command=changeEpoch(20))

Он имеет тот же эффект, что и этот:

result = changeEpoch(20)
epochRadioButton20 = Radiobutton(..., command=result)

Атрибут command принимает вызываемый ,Однако ваш код немедленно вызывает функцию и передает результат атрибуту command.

Я рекомендую вместо передачи нового значения функции получить функцию из радиокнопки.,Для этого внесите следующие изменения:

def changeEpoch():
    epochValue = var1.get()
    config.epoch=epochValue
...
epochRadioButton20 = Radiobutton(..., command=lambda: changeEpoch)

Другим решением будет создание анонимной функции с lambda, которая вызывает changeEpoch (при этом вы оставляете changeEpoch неизмененным):

epochRadioButton20 = Radiobutton(..., command=lambda: changeEpoch(20))
...