«список индексов вне диапазона» с функцией lamda в python и tkinter не отображается должным образом - PullRequest
0 голосов
/ 05 июня 2019

Когда я нажимаю кнопку «вперед», появляется сообщение об ошибке «Индекс списка вне диапазона».

Привет, я работаю над этой проблемой уже несколько недель. В моем предыдущем посте кто-то предложил мне научиться правильно использовать лямбда-функции, что я и сделал. Я работал над несколькими более простыми версиями, чтобы понять, понимаю ли я концепцию, и теперь я перехожу к этой версии.

При настройке кода все будет работать правильно, кроме 1 маленькой ошибки. Я могу нажать кнопку «Рассчитать» на каждом блокноте, и он запустит метку и результат модели из Pulp. Я даже могу нажать кнопку «вперед», и она вычислит с помощью Pulp все результаты, полученные на ноутбуках, но на ней не будет отображаться ярлык «недели 2».

Я не знаю, где проблема, или какой код мне не хватает, или код, который мне нужно отредактировать.

Если кто-то может мне помочь, это было бы здорово, если бы я мог преодолеть этот горб и использовать ту же концепцию с моей более крупной программой.

import tkinter as tk
from tkinter import ttk
from functools import partial
import random
import pulp

class Application(tk.Tk):
    def  __init__(self):
        super().__init__()
        self.title("notbook my own try")
        self.geometry("550x350")
        self.config(bg="tan")

        self.style = ttk.Style()
        self.lnb = Sheets(self) 

class Sheets(ttk.Notebook): 
    def __init__(self, parent): 
        parent.style.configure("down.TNotebook", tabposition="sw")
        super().__init__(parent, style = "down.TNotebook")
        self.pack(fill = tk.BOTH, expand =1)
        self.parent = parent

        self.week_index = ['Week 1', "Week 2"] 
        self.sheet_dict = {} 

        for num, week in enumerate(self.week_index, 1 ):
            self.week = One_Weekly_Notebook(self, num)
            self.week.pack()
            self.add(self.week, text = week)
            self.pack()
            self.sheet_dict[week] = self.week 

class One_Weekly_Notebook(ttk.Notebook): 
    def __init__(self, parent, index):
        super().__init__(parent)
        self.pack(fill = tk.BOTH, expand =1)
        self.index = index
        self.parent = parent

        self.upper_tabs_dict = {}
        self.labelVariable_list = []
        self.label_list = []
        self.Var_list = []
        self.dropMenu_list = []
        self.answer_list = []
        self.model_list = []

        self.optionList=["1", "2", "3", "4", "5", "6"]
        self.optionList_random = []

        self.object_final = Final(self)
        tab1 = self.object_final 
        tab1.pack()

        self.add(tab1, text = "Final")
        self.pack()
        self.upper_tabs_dict["Final"] = tab1

    def pulp_process(self, button):
        self.a_value = int(self.parent.sheet_dict[f'Week  
                    {button}'].Var_list[0].get()) #1st dropdown value
        self.b_value= int(self.parent.sheet_dict[f'Week 
                    {button}'].Var_list[1].get())  #2nd dropdown value

    # Instantiate our problem class
        self.model = pulp.LpProblem("Profit maximising problem", 
                   pulp.LpMaximize)
        self.A = pulp.LpVariable('A', lowBound=0, cat='Integer') 
        self.B = pulp.LpVariable('B', lowBound=0, cat='Integer') 

    # Objective function
        self.model += (self.a_value * self.A ) + (self.b_value * 
                    self.B), "Profit"

    # Constraints
        self.model += 3 * self.A + 4 * self.B <= 3
        self.model += 5 * self.A + 6 * self.B <= 6
        self.model += 1.5 * self.A + 3 * self.B <= 2

    # Solve the problem
        self.model.solve()
        self.answer= pulp.value(self.model.objective)


    def see_label(self, button):
        self.parent.sheet_dict[f"Week  
        {button}"].label_list[0].configure
        (text = self.parent.sheet_dict[
                            f"Week {button}"].answer)

class Final(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        self.pack(fill=tk.BOTH, expand=1)
        self.parent = parent

        self.labels()
    def labels(self):
        self.label=tk.Label(self, bg="orange", fg="white")
        self.label.pack()
        self.parent.label_list.append(self.label)

        self.random()
    def random(self):
        for i in range(2):
            self.random = random.choice(self.parent.optionList)
            self.parent.optionList_random.append(self.random)

        self.dropdowns()
    def dropdowns(self):
        for i in range(2):
            self.Var = tk.StringVar()
            self.dropMenu=tk.OptionMenu(self, self.Var, 
                          *self.parent.optionList)
            self.dropMenu.config(width = 10)
            self.dropMenu.pack(side = "left")

            self.parent.Var_list.append(self.Var)
            self.parent.dropMenu_list.append(self.dropMenu)


            self.parent.Var_list[i].set
                      (self.parent.optionList_random[i])

        self.buttons()
    def buttons(self):
        value = self.parent.index
        self.button=tk.Button(self, text="calculate")
        self.button.pack(side = "left")
        self.button.configure(command= lambda button=value: 
                    self.parent.pulp_process(button))

        self.button = tk.Button(self, text="Forward", command =  
                      self.forward)
        self.button.pack ()

    def forward(self):
        self.parent.pulp_process(1)
        self.parent.pulp_process(2)

if __name__ == '__main__':
    Application().mainloop()

Когда я нажимаю кнопку «вперед», она должна показывать результаты целлюлозы на этикетке за все недели вместе.

...