Tkinter: сохранить запись как список или вектор - PullRequest
0 голосов
/ 24 апреля 2020

Я пишу код, в котором мне нужно 3 разных вектора входа. Код ниже:

import numpy as np

y = [2, 100, 1000,10000]
alp = [0.9, 0.9, 0.9,0.9]
bet = [0.8, 0.8, 0.8,0.9]


def diff(x, i, n):
    pp = 0  # poor poor
    pr = 0  # poor rich
    rr = 0  # so on...
    rp = 0
    for j in range(len(y)):
        if i < n and j < n:  # when i is poor and j is poor
            b = (np.maximum(y[i] - y[j], 0))
            pp += b

        elif i < n and j >= n:  # when i is poor and j is rich
            c = (np.maximum(y[i] + x[1] - (1 - x[1]) * y[j], 0))
            pr += c

        elif i >= n and j >= n:  # i rich and j rich
            d = (np.maximum((1 - x[1]) * y[i] - (1 - x[1]) * y[j], 0))
            rr += d

        elif i >= n and j < n:  # i rich j poor
            e = (np.maximum((1 - x[1]) * y[i] - (x[0] + y[j]), 0))
            rp += e

    return pp + pr + rr + rp


def main(x, n):
    r = 0
    p = 0
    for i in range(len(y)):
        if i < n:

            r += -1 * ((1 - x[1]) * y[i] - (alp[i] / (len(y) - 1)) * diff(x, i, n) + (bet[i] / (len(y) - 1)) * diff(x,
                                                                                                                    i,
                                                                                                                    n))


        else:

            p += -1 * (y[i] + x[1] - (alp[i] / (len(y) - 1)) * diff(x, i, n) + (bet[i] / (len(y) - 1)) * diff(x, i, n))
    print(r+p)
    return r + p


def tax_rev(n):
    r = 0
    for i in range(n, len(y)):
        r += y[i]

    return r



bounds = [(0, np.inf), (0, 1)]
mat = np.zeros((len(y), 4))
for i in range(len(y)):
    def constraint1(x):
        return x[1] * tax_rev(i) - x[0] * (i)
    cons1 = {'type': 'ineq', 'fun': constraint1}


    def co(x):
        return main(x, i)



    max = optimize.shgo(co, bounds=bounds, constraints=cons1)

    mat[i, 0] = '{0:.10f}'.format(max.x[0])
    mat[i, 1] = '{0:.10f}'.format(max.x[1])
    mat[i, 2] = '{0:.10f}'.format(max.fun)
    mat[i,3]= max.success


print(mat[1:])

Код выше по существу принимает y, alp и bet в качестве векторов входа и оптимизации функции. Код работает, и я хочу создать интерфейс с Tkinter, с помощью которого я могу взять в качестве входных данных 3 вектора любой (но равной) длины и решить ту же задачу, что и код выше. Я изо всех сил пытаюсь получить входные данные. Входные данные должны быть списками или векторами. Вот что у меня есть до сих пор:

from scipy import optimize
import numpy as np

root = tk.Tk()

canvas1 = tk.Canvas(root, width=400, height=300)
canvas1.pack()

y=[]
alp=[]
bet=[]

entry1 = tk.Entry(root)
entry2 = tk.Entry(root)
entry3 = tk.Entry(root)

y=y.append(entry1)
alp=alp.append(entry2)
bet=bet.append(entry3)

canvas1.create_window(200, 140, window=entry1)
canvas1.create_window(0, 140, window=entry2)
canvas1.create_window(400, 140, window=entry3)


y=entry2.get()
alp=entry1.get()
bet=entry3.get()


print(y)


def diff(x, i, n):
    pp = 0  # poor poor
    pr = 0  # poor rich
    rr = 0  # so on...
    rp = 0
    for j in range(len(y)):
        if i < n and j < n:  # when i is poor and j is poor
            b = (np.maximum(y[i] - y[j], 0))
            pp += b

        elif i < n and j >= n:  # when i is poor and j is rich
            c = (np.maximum(y[i] + x[1] - (1 - x[1]) * y[j], 0))
            pr += c

        elif i >= n and j >= n:  # i rich and j rich
            d = (np.maximum((1 - x[1]) * y[i] - (1 - x[1]) * y[j], 0))
            rr += d

        elif i >= n and j < n:  # i rich j poor
            e = (np.maximum((1 - x[1]) * y[i] - (x[0] + y[j]), 0))
            rp += e

    return pp + pr + rr + rp


def main(x, n):
    r = 0
    p = 0
    for i in range(len(y)):
        if i < n:

            r += -1 * ((1 - x[1]) * y[i] - (alp[i] / (len(y) - 1)) * diff(x, i, n) + (bet[i] / (len(y) - 1)) * diff(x,
                                                                                                                    i,
                                                                                                                    n))


        else:

            p += -1 * (y[i] + x[1] - (alp[i] / (len(y) - 1)) * diff(x, i, n) + (bet[i] / (len(y) - 1)) * diff(x, i, n))
    print(r+p)
    return r + p


def tax_rev(n):
    r = 0
    for i in range(n, len(y)):
        r += y[i]

    return r



bounds = [(0, np.inf), (0, 1)]





def answer():
    mat = np.zeros((len(y), 4))
    for i in range(len(y)):
        def constraint1(x):
            return x[1] * tax_rev(i) - x[0] * (i)

        cons1 = {'type': 'ineq', 'fun': constraint1}

        def co(x):
            return main(x, i)

        max = optimize.shgo(co, bounds=bounds, constraints=cons1)

        mat[i, 0] = '{0:.10f}'.format(max.x[0])
        mat[i, 1] = '{0:.10f}'.format(max.x[1])
        mat[i, 2] = '{0:.10f}'.format(max.fun)
        mat[i, 3] = max.success

    label1 = tk.Label(root, text=mat[2,2])
    canvas1.create_window(200, 230, window=label1)


button1 = tk.Button(text='Get the answer', command=answer)
canvas1.create_window(200, 180, window=button1)

root.mainloop()

Этот код вообще не работает. Когда вы запускаете его, он показывает 3 поля ввода. Начиная слева, это y, alp и bet (как в первом фрагменте кода). Я думаю, что записи не сохраняются в виде списка, поэтому он не работает. Может быть, по какой-то другой причине. Поскольку я новичок ie, любая помощь и комментарии по моему коду приветствуются.

...