【问题标题】:Tkinter radio button assigning last variable when run?Tkinter单选按钮在运行时分配最后一个变量?
【发布时间】:2019-05-12 21:42:18
【问题描述】:

我有三个文件,我正在尝试通过单选按钮更改变量的值:

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,我似乎无法弄清楚为什么。

【问题讨论】:

  • 我有同样的经历,Tkinter 似乎默认使用最后一个单选按钮,或者如果之前没有运行过,则默认使用所有单选按钮。我很想知道是否有人知道以不同方式控制这种情况的方法。
  • @NielsHenkens 我在 'command=' 之后添加了 'lambda:' ,它似乎有效

标签: python tkinter radio-button variable-assignment


【解决方案1】:

考虑这行代码:

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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-15
    • 2015-09-11
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 2012-05-04
    • 2015-06-15
    • 2019-06-27
    相关资源
    最近更新 更多