python - Tkinter entry.get() 不更新 [Gurobi Python]
问题描述
为了更简单地演示我的问题,我使用了一个非常简单的线性程序。我想将一个约束的右侧设置为我在输入框(Tkinter)中键入的某个值。当我单击按钮时,不等于零的变量将显示在标签中。
问题:输入框的初始值为 0。当我将其更改为例如 100 时,我仍然得到相同的结果。结果不会改变我在输入框中输入的任何内容。当我将约束的右侧值硬编码为任何其他值时,结果会发生变化,但如果我在输入框中进行更改则不会。
似乎无论我在输入框中输入什么,Python 总是采用初始值,即 0。它不会更新为我输入的内容
import Tkinter as tk
from gurobipy import *
WIDTH = 330
HEIGHT = 500
root = tk.Tk()
canvas = tk.Canvas(root, height=HEIGHT, width=WIDTH)
canvas.pack()
conslabel = tk.Label(root, text='Constraint value')
conslabel.place(relx=0.1, rely = 0.02)
var = tk.IntVar()
entry = tk.Entry(root, textvariable=var)
entry.place(relx=0.5, rely=0.02, relwidth=0.3)
button = tk.Button(root, text = "yield result", command = lambda: [setEntryValue(), build_model(entryValue), m.optimize(), results(), m.reset()])
button.place(relx = 0.5, rely = 0.675, anchor = tk.CENTER)
outputLabel = tk.Label(root, bg='white')
outputLabel.place(relx = 0.5, rely = 0.85, anchor = tk.CENTER, relheight = 0.2, relwidth = 0.8)
entryValue = 0
def build_model(entryValue):
m = Model("lp1")
m.setParam('OutputFlag', False)
x1 = m.addVar(name="x1")
x2 = m.addVar(name="x2")
m.update()
m.setObjective(5*x1 + 4*x2, GRB.MAXIMIZE)
m.addConstr(6*x1 + 4*x2 <= 24, "constr_1")
m.addConstr(1*x1 + 2*x2 <= 6, "constr_2")
m.addConstr(-1*x1 + 1*x2 <= 1, "constr_3")
m.addConstr(x2 <= entryValue, "constr_4")
def setEntryValue():
global entryValue
entryValue = var.get()
return entryValue
def labeltext():
finalvars = ''
for v in m.getVars():
if v.x != 0:
finalvars += ' ' + str(v.varName)
return finalvars
def results():
for v in m.getVars():
print('%s: %f' % (v.varName, v.x))
print('Obj: %f' % m.objVal)
outputLabel['text'] = labeltext()
root.mainloop()
解决方案
在创建小部件大约一毫秒后,您将获得小部件的值Entry
,远在用户有机会输入任何内容之前。entryValue
用户输入数据时不会更新。
您需要等到entry.get()
用户有机会输入数据后再调用。通常这意味着在与按钮或菜单项关联的回调中执行此操作。
您应该为“产生结果”按钮创建一个函数,而不是使用lambda
. 然后,在该函数中,您可以设置数据并计算结果。
它应该看起来像这样:
def yield_result():
entryValue = int(entry.get())
m.setObjective(5*x1 + 4*x2, GRB.MAXIMIZE)
m.addConstr(6*x1 + 4*x2 <= 24, "constr_1")
m.addConstr(1*x1 + 2*x2 <= 6, "constr_2")
m.addConstr(-1*x1 + 1*x2 <= 1, "constr_3")
m.addConstr(x2 <= entryValue, "constr_4")
return [m.optimize(), results()]
...
button = tk.Button(root, text = "yield result", command = yield_result)
推荐阅读
- c# - 我怎样才能使我的代码线程安全或者它是线程安全的?
- python - 计算 dcgan 中的损失
- java - 将脚本转换为 exe 时无法执行我的脚本
- json - 如何在 json-schema 中的“then”中表达项目属性?
- python - 数据框中的条件替换
- iframe - driver.switchTo.defaultContent 的 Selenium IDE 等效项是什么?
- php - 如何使 feof 不计算文件的最后一行?
- powershell - 将 Invoke-RestMethod 输出解析为 csv 文件
- python - CreateView 返回“Experience.id_auth_user”必须是“AuthUser”实例
- javascript - 如何在 PHP 脚本中访问会话变量?