簡體   English   中英

Tkinter entry.get() 不更新 [ Gurobi Python ]

[英]Tkinter entry.get() does not update [ 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)

我認為問題在於您需要為您的條目分配一個文本變量:

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

當你想在輸入框中獲取文本時,你可以使用string = entry_var.get()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM