#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()