Tkinter 单选按钮在 运行 时分配最后一个变量?
Tkinter radio button assigning last variable when run?
我有三个文件,我正在尝试通过单选按钮更改变量的值:
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,我似乎无法弄清楚为什么。
考虑这行代码:
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))
我有三个文件,我正在尝试通过单选按钮更改变量的值:
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,我似乎无法弄清楚为什么。
考虑这行代码:
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))