Загрузка предыдущих сохраненных ответов Tkinter OptionMenu

Мне нужна помощь, чтобы решить эту проблему при загрузке данных в меню параметров tkinter. Я прочитал несколько ответов на Stackoverflow и считаю, что очень близок, но не вижу, где ошибаюсь.

Приложение представляет собой анкету с несколькими страницами (я добавил только 2, чтобы было легче понять, о чем приложение), которая сохраняет информацию в файле Excel, и теперь я пытаюсь загрузить эту информацию обратно, если пользователь решит сохранить на мгновение и продолжить позже.

Отредактированная часть ниже:

До сих пор вся моя загруженная информация сохраняется, но меню параметров не обновляется данными.

Полный рабочий код с простой частью того, что я разработал, приведен ниже:

import tkinter as tk, pandas as pd
from tkinter import ttk, messagebox

window = tk.Tk()

choices_y_n = ['-', 'Yes', 'No'] 
Questionlist = ["A. Is true?:", "B. Is True? :","C. Is True? :", "D. True? :"]
dash_entry_quality = [" - ", " - ", " - ", " - ", " - ", " - ", " - "]

def global_save(): 
    list_answers = list(map(lambda x: x.get(), var))
    a = ({"Q1": list_answers})    
    dfa = pd.DataFrame.from_dict(a, orient='index').transpose()
    writer = pd.ExcelWriter("save_data.xlsx", engine='xlsxwriter')
    dfa.to_excel(writer, sheet_name='Save Files')
    writer.save()
    messagebox.showinfo("Success!", "Progress successfully saved!")  

def load():
    global dash_entry
    file = pd.read_excel("save_data.xlsx")        
    dash_entry = file["Q1"]
    for r in range(len(Questionlist)): 
        var[r].set('')
        option_menu['menu'].delete(0, 'end')
        for c in dash_entry:
            option_menu['menu'].add_command(label = c, command = tk._setit(var[r], c))
    messagebox.showinfo("Success!", "information successfully loaded!")  

window.columnconfigure(0, minsize=100)
window.columnconfigure(1, minsize=150)
window.columnconfigure(2, minsize=50)     
tk.Frame.configure(window, background = "white")
ttk.Label(window, text="Group A Checklist", background = "white").grid(row=1, column=0, columnspan=3, pady = 10)
ttk.Label(window, text="Questions: ", background="white").grid(row=2, column=0,columnspan=2, padx=10, pady = 10, sticky="W")
global var, option_menu
var= [tk.StringVar(window) for i in range(len(Questionlist))]
for r in range(len(Questionlist)): 
    ttk.Label(window, text=Questionlist[r], background = "white").grid(row= r+3, column=0, columnspan=2, padx=10, pady = 10, sticky="W")
    option_menu = ttk.OptionMenu(window, var[r], *choices_y_n)
    option_menu.grid(row = r+3, column=2, padx=10, sticky="WE")
ttk.Button(window, text="Save values", command = global_save, width=18).grid(row=16, column=0, padx=10, pady=15, sticky="W")
ttk.Button(window, text="Load values", command = load, width=18).grid(row=17, column=0, padx=10, pady=15, sticky="W")

window.mainloop()

person Rafael Castelo Branco    schedule 29.11.2018    source источник
comment
Вы разместили слишком много кода. Пожалуйста, уменьшите его до минимально воспроизводимого примера. Похоже, вы спрашиваете, как прочитать файл Excel, чтобы заполнить некоторые меню опций. Это займет не более пары десятков строк для подражания.   -  person Bryan Oakley    schedule 30.11.2018
comment
Извините, @BryanOakley, я отредактировал код для более простой версии. Идея состоит в том, чтобы прочитать файл Excel, но только если нажата кнопка «Загрузить».   -  person Rafael Castelo Branco    schedule 30.11.2018
comment
Обе ваши кнопки имеют command = global_save. Вы никогда не звоните load().   -  person fhdrsdg    schedule 30.11.2018
comment
Извините, @fhdrsdg, я ошибся, когда редактировал файл, чтобы сделать его меньше. Только что отредактировал еще раз.   -  person Rafael Castelo Branco    schedule 30.11.2018
comment
Почему вы пытаетесь пересобрать полное OptionMenu? Параметры остаются прежними, и вы просто хотите правильно установить выбранное значение? вы можете просто установить такие значения, как for r in range(len(Questionlist)): var[r].set(dash_entry[r]).   -  person fhdrsdg    schedule 30.11.2018
comment
Спасибо за помощь @fhdrsdg! Теперь это работает! Я вообразил, что это было что-то простое, чего я не видел! Можете ли вы опубликовать ответ как ответ, чтобы я принял решение и закрыл вопрос?   -  person Rafael Castelo Branco    schedule 30.11.2018
comment
Приятно слышать! Я напишу это как правильный ответ, чтобы показать, что на ваш вопрос был дан ответ.   -  person fhdrsdg    schedule 30.11.2018


Ответы (1)


Вы слишком все усложняете. Нет необходимости полностью перестраивать OptionMenu, вы можете просто обновить переменные, содержащие текущий ответ, до загруженных ответов:

def load():
    file = pd.read_excel("save_data.xlsx")        
    dash_entry = file["Q1"]
    for r in range(len(Questionlist)): 
        var[r].set(dash_entry[r])
    messagebox.showinfo("Success!", "Information successfully loaded!")  
person fhdrsdg    schedule 30.11.2018