Добавление ключей и значений во вложенный словарь через поля ввода и доступ к нему через поле комбинаций

#python #dictionary #tkinter #combobox #tkinter-entry

Вопрос:

Можно ли добавить новые ключи и значения, Entrybox а затем сразу же после этого получить к ним доступ, Combobox также убедившись, что новые key и values из sub-keys физически сохранены и добавлены dictionary справа после их добавления. Когда я print только что добавил key и values sub-keys все кажется в порядке, но нет никаких изменений в dict1 его содержании и Combobox значениях.

Вот код:

 from tkinter import *
from tkinter.ttk import Combobox

def add():

    dict1[entrybox.get()] = {'name_company': entrybox1.get(), 'country_company': entrybox2.get()}
    print(dict1)

dict1 = {"": {"name_company": 0,
    "country_company" : 0,},

    "Company1": {"name_company": "Company1 LTD",
    "country_company": "Germany"}}

window =Tk()

var1=StringVar()

entrybox = Entry(window) #adding main key ("Company1") as an example
entrybox.pack()

entrybox1 = Entry(window) #adding value of sub-key ("name_company")
entrybox1.pack()

entrybox2 = Entry(window) #adding value of sub-key ("country_company")
entrybox2.pack()

combo = Combobox(window, value=list(dict1.keys()), textvariable=dict1[var1.get()])
combo.pack()

button = Button(window, text="Add", command=add)
button.pack()
 

Ответ №1:

Если я правильно понял ваш вопрос, я думаю, что следующий код предоставит вам то, что вы хотите, или приблизит вас к вашей конечной цели.

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

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

Затем функция Add извлекает данные из ComboValues.txt файл, сортирует их в алфавитном порядке и назначает их в поле со списком. Я не утверждаю, что это лучшая практика, но она должна соответствовать вашим требованиям.

в примечании я бы посоветовал избегать использования * при импорте модулей. это может привести к беспорядку, попробуйте просто импортировать то, что вам нужно, например. Combobox, Stringvar, Запись …… и т. Д.

Надеюсь, это поможет, любой вопрос или разъяснение зацепят меня.

 import os
from tkinter import Entry, StringVar, Tk, Button
from tkinter.ttk import Combobox

Root = Tk()
#set combobox values to empty list
ComboboxValue = []

#String variables for dictionary values
MainKey = StringVar()
SubKey1 = StringVar()
Subkey2 = StringVar()

#Set dictionary values to open list
Dict = {}

#A place to save dictionary key values to read from later
file = open('Combovalues.txt', 'a')

#defining the function for adding entry values to dictionary
def Add():

#Second dictionary used to update original
    DictUpdated = {MainKey.get():{'name_company':SubKey1.get(), 'country_company':Subkey2.get()}}

#Method to update original dictionary
    Dict.update(DictUpdated)

    print(Dict)

#function to update combobox txt file with entry values
    with open('ComboValues.txt', 'a') as file:
        file.write('n' (str(SubKey1.get()) 'n' (str(Subkey2.get()))))
        file.close

#function to update Dictionary txt file with entry values        
    with open('Dictionary.txt', 'a') as file:
        file.write('n' str((Dict)))
        file.close

#function to sort through entry values saved to combobox txt file, ready for assigning to combobox
def ValueSource():
    with open('ComboValues.txt') as inFile:
        ComboboxValue = [line for line in inFile]
        ComboboxValue = sorted(ComboboxValue)
        return ComboboxValue

#Function to retrieve values from combo txt file and assigned to combobox
def GetUpdatedValues():
    Values = ValueSource()
    Root.Combobox['values'] = Values

#Class to build GUI   
class GUI ():
    def __init__(self, master):
        self.master = master
        master.EntryMainKey = Entry(Root, textvariable= MainKey).grid(row=0, columnspan=2)
        master.EntrySubKey1 = Entry(Root, textvariable= SubKey1).grid(row=1, columnspan=2)
        master.EntrySubKey2 = Entry(Root, textvariable= Subkey2).grid(row=2, columnspan=2)
        master.AddButton = Button(Root, text='Add', command=Add).grid(row=3, columnspan=2)
        master.Combobox = Combobox(Root, state='normal', postcommand=GetUpdatedValues)
        master.Combobox['values'] = ComboboxValue
        master.Combobox.grid(row=4, columnspan=2)

#Mainloop function    
def main():
    GUI(Root)
    Root.mainloop()

main()