#python #tkinter #pickle
Вопрос:
Я создаю своего рода программу для списка покупок на Python (3.7, в Windows, с TKinter), специально разработанную для настройки аппаратных синтезаторов. Подумайте о выборе деталей для ПК, но для настройки синтезатора.
Он сохраняет пользовательский выбор каждого компонента в словаре. Затем, когда пользователь нажимает кнопку сохранить, он использует библиотеку pickle для сохранения словаря в файл. Когда они снова открывают приложение, оно загружает словарь из файла и должно установить содержимое всех полей ввода в соответствующее значение в словаре. Это работало нормально, но затем я добавил еще одну категорию для входа пользователя, и она перестала работать.
Вот код:
#import libraries
from tkinter import *
import pickle
win=Tk() #create window
win.title("Synth Planner") #set title
win.configure(bg="#010") #set background
win.geometry("1200x675") #set size
savedict={"seq":"", "seq$":"","synth1":"","synth1$":"","synth2":"","synth2$":""}
def save(): #when save btn pressed
#save all entries to dict
savedict["seq"]=txtSeq.get()
savedict["seq$"]=txtSeqPrice.get()
savedict["synth1"]=txtSynth1.get()
savedict["synth1$"]=txtSynth1Price.get()
#this is the line causing the error:
savedict["synth2"]=txtSynth2.get()
#^
savedict["synth2$"]=txtSynth2Price.get()
#save dict to file
with open("data","wb") as savefile: #open file
pickle.dump(savedict,savefile) #use pickle to save dict
#create components
lblTitle=Label(win,font=("Trebuchet MS",28),text="Synth Planner",bg="#010",fg="#fff") #title
btnSave=Button(win,font=("Trebuchet MS",12),text="Save",command=save) #save button
lblPrice=Label(win,font=("Trebuchet MS",12),text="Price",bg="#010",fg="#fff") #price label
lblSeq=Label(win,font=("Trebuchet MS",12),text="Sequencer",bg="#010",fg="#fff") #sequencer label
txtSeq=Entry(win,font=("Trebuchet MS",12),bg="#fff",fg="#010") #sequencer entry
txtSeqPrice=Entry(win,font=("Trebuchet MS",12),bg="#fff",fg="#010",width=10) #seq price
lblSynth1=Label(win,font=("Trebuchet MS",12),text="Synth",bg="#010",fg="#fff") #synth 1 label
txtSynth1=Entry(win,font=("Trebuchet MS",12),text="Synth",bg="#fff",fg="#010") #synth 1 entry
txtSynth1Price=Entry(win,font=("Trebuchet MS",12),bg="#fff",fg="#010",width=10) #synth 1 price entry
lblSynth2=Label(win,font=("Trebuchet MS",12),text="Synth",bg="#010",fg="#fff") #synth 2 label
txtSynth2=Entry(win,font=("Trebuchet MS",12),text="Synth",bg="#fff",fg="#010") #synth 2 entry
txtSynth2Price=Entry(win,font=("Trebuchet MS",12),bg="#fff",fg="#010",width=10) #synth 2 price entry
#set all text inputs to previous user inputs, by reading pickle file
with open("data","rb") as savefile: #open file
savedict=pickle.load(savefile) #load file into dict
#set all entries
txtSeq.insert(0,savedict.get("seq"))
txtSeqPrice.insert(0,savedict.get("seq$"))
txtSynth1.insert(0,savedict.get("synth1"))
txtSynth1Price.insert(0,savedict.get("synth1$"))
txtSynth2.insert(0,savedict.get("synth2"))
txtSynth2Price.insert(0,savedict.get("synth2$"))
#place components
lblTitle.place(x=600,y=20,anchor=N)
btnSave.place(x=1150,y=30,anchor=N)
lblPrice.place(x=300,y=50,anchor=N)
lblSeq.place(x=10,y=80)
txtSeq.place(x=90,y=82)
txtSeqPrice.place(x=270,y=82)
lblSynth1.place(x=10,y=120)
txtSynth1.place(x=90,y=122)
txtSynth1Price.place(x=270,y=122)
lblSynth2.place(x=10,y=160)
txtSynth2.place(x=90,y=162)
txtSynth2Price.place(x=270,y=162)
win.mainloop #keep the window open until closed by user
Вот сообщение об ошибке:
in insert
self.tk.call(self._w, 'insert', index, string)
_tkinter.TclError: wrong # args: should be ".!entry5 insert index text"
Метод, который я использую для вставки текста, отлично работал в приведенных выше строках, которые делают то же самое.
Пожалуйста, дайте мне знать, если я должен предоставить какую-либо другую информацию. Я не очень часто пишу здесь.
Спасибо.
Комментарии:
1. Я не думаю, что есть какие-то проблемы. Я прекрасно работал для себя. Пожалуйста, предоставьте полное сообщение об ошибке, от обратного хода до последнего
2. Пожалуйста, предоставьте всю обратную связь
3. Где происходит ошибка?
4. Мне пришлось заменить win.mainloop на win.mainloop(), тогда это сработало нормально.
5. Вы получите эту ошибку, если значение, которое вы пытаетесь вставить, равно
None
. Я предполагаю, что в вашем файле сохранения естьNone
значение.