Tkinter entry.get()不更新[Gurobi Python]
为了更简单地演示我的问题,我使用了一个非常简单的线性程序。 我想将一个约束的右侧设置为我在输入框(Tkinter)中键入的某个值。 当我点击按钮时,不等于零的变量将显示在标签中 问题:输入框的初始值为0。当我将其更改为例如100时,仍然会得到相同的结果。结果不会改变我在输入框中键入的任何内容。 当我将约束的右侧值硬编码为任何其他值时,结果会更改,但如果我在输入框中更改它,结果不会更改 似乎无论我在输入框中键入什么,Python都会采用初始值,即0。它不会更新到我输入的内容Tkinter entry.get()不更新[Gurobi Python],python,tkinter,gurobi,Python,Tkinter,Gurobi,为了更简单地演示我的问题,我使用了一个非常简单的线性程序。 我想将一个约束的右侧设置为我在输入框(Tkinter)中键入的某个值。 当我点击按钮时,不等于零的变量将显示在标签中 问题:输入框的初始值为0。当我将其更改为例如100时,仍然会得到相同的结果。结果不会改变我在输入框中键入的任何内容。 当我将约束的右侧值硬编码为任何其他值时,结果会更改,但如果我在输入框中更改它,结果不会更改 似乎无论我在输入框中键入什么,Python都会采用初始值,即0。它不会更新到我输入的内容 import Tkin
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()
将Tkinter作为tk导入
从gurobipy导入*
宽度=330
高度=500
root=tk.tk()
canvas=tk.canvas(根,高度=高度,宽度=宽度)
canvas.pack()
conslabel=tk.Label(根,text='Constraint value')
conslab.place(relx=0.1,rely=0.02)
var=tk.IntVar()
entry=tk.entry(根,textvariable=var)
入口位置(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())
按钮位置(relx=0.5,rely=0.675,锚定=tk.中心)
outputLabel=tk.Label(根,bg='white')
outputLabel.place(relx=0.5,rely=0.85,anchor=tk.CENTER,relheight=0.2,relwidth=0.8)
entryValue=0
def构建_模型(入口值):
m=型号(“lp1”)
m、 setParam('OutputFlag',False)
x1=m.addVar(name=“x1”)
x2=m.addVar(name=“x2”)
m、 更新()
m、 设定目标(5*x1+4*x2,GRB最大化)
m、 addConstr(6*x1+4*x2我认为问题在于您需要为条目分配一个textvariable:
entry_var = tk.StringVar()
entry = tk.Entry(root, textvar = entry_var)
当您想在输入框中获取文本时,只需使用string=entry\u var.get()
就可以在创建entry
小部件后大约一毫秒内获取该小部件的值,远远早于用户有机会输入任何内容。entryValue
在用户输入数据时不会得到更新
您需要等待调用entry.get()
,直到用户有机会输入数据。通常这意味着在与按钮或菜单项关联的回调中执行此操作
您应该为“yield result”按钮创建一个函数,而不是使用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)
def yield_result():
entryValue=int(entry.get())
m、 设定目标(5*x1+4*x2,GRB最大化)
m、 addConstr(6*x1+4*x2这什么都不做:m.optimize
这是静态的:x2是的,我忘了删除m.optimize,但是x2“x2@BryanOakley”显示了addVar
的定义是什么:我们能做什么:.addVar(name=“entry”)
以及以后的(x2好的,这真的很奇怪,我写了一个函数setEntryValue(),它就是entryValue=int(entry.get())和一个函数build_model(),它创建了模型,我把这两个函数放在按钮命令的lambda集中,所以当我首先按下按钮时,entryValue将被设置为entry.get()然后,模型被创建,它仍然始终使用条目的初始“0”…我将更新代码我用var=tk.IntVar()条目=tk.entry(root,textvariable=var)
和以后的entryValue=var.get()更新它
之前,但它没有起作用。不幸的是,我遇到了完全相同的问题StringVar
很少需要条目
小部件,并且不能解决这个特殊问题。