【问题标题】:Tkinter entry.get() does not update [ Gurobi Python ]Tkinter entry.get() 不更新 [Gurobi Python]
【发布时间】:2019-12-09 15:57:43
【问题描述】:

为了更简单地演示我的问题,我使用了一个非常简单的线性程序。 我想将一个约束的右侧设置为我在输入框(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()

【问题讨论】:

  • 这什么都不做:m.optimize 这是静态的:x2 &lt;= entryValue
  • oops 是的,我忘了删除 m.optimize,但是 x2
  • “x2 entryValue 是初始值,永远不会被链接
  • @BryanOakley “显示addVar 的定义”:我们可以这样做吗:.addVar(name="entry") 及以后(x2 &lt;= entry.get()
  • 好吧,这真的很奇怪,我写了一个函数 setEntryValue() 它只是 entryValue = int(entry.get()) 和一个创建模型的函数 build_model() 我把那些按钮命令的 lambda 集中的两个函数,所以当我首先按下按钮时,entryValue 将设置为 entry.get(),然后创建模型,它仍然始终采用条目的初始“0” ...我要更新代码

标签: python tkinter gurobi


【解决方案1】:

在创建 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)

【讨论】:

    【解决方案2】:

    我认为问题在于您需要为您的条目分配一个文本变量:

    entry_var = tk.StringVar()
    entry = tk.Entry(root, textvar = entry_var)
    

    当你想获取输入框中的文字时,你可以使用string = entry_var.get()

    【讨论】:

    • 我用var = tk.IntVar() entry = tk.Entry(root, textvariable=var) 和后来的entryValue = var.get()before 厌倦了它,但它没有用,分别。不幸的是,我遇到了完全相同的问题
    • StringVar 很少需要与 Entry 小部件一起使用,并且不能解决此特定问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    相关资源
    最近更新 更多