python-3.x 如何从多个Tkinter输入框中获取数据(DoubleVar)并将其保存到.dat文件中,然后检索它们以重新填充所述框

yjghlzjz  于 2022-12-27  发布在  Python
关注(0)|答案(1)|浏览(288)

首先让我说全新的在这里和全新的编码
我试图完成的整个想法是有一个参数列表,用户可以保存这些参数,以后使用时不必更改代码
我有一个更大的程序,我的工作,但我已经简化了这段代码,以弄清楚这一点。我有下面的代码,将获得和接收一个单一的输入框,如果我试图添加第二个输入框到“保存”,然后它只是添加到第一个输入框像连接。

import tkinter
from tkinter import *
from tkinter import filedialog
from tkinter import ttk
import sqlite3
import pickle
#---------------------------------------------------------------


#---------------------------------------------------------------
root = Tk()
root.title("Cabinet Cut List Calculator")

frame = LabelFrame(root)
frame.pack()
#---------------------------------------------------------------

#---------------------------------------------------------------
toek = DoubleVar(value=3.5)
default_hgt = IntVar(value=42)
 
parms_list = [toek, default_hgt]


#---------------------------------------------------------------

#---------------------------------------------------------------
def SaveParms():
    parms_name = filedialog.asksaveasfilename(initialdir="/Users/Owner/Desktop/Python/cab databases/Parameters", title="Save Parameters", filetypes=(("Dat Files", "*.dat"),("All Files", "*.*")))

    if parms_name:
        if parms_name.endswith(".dat"):
            pass
        else:
            parms_name = f"{parms_name}.dat"

    parms_list = y.get()

    output_parms = open(parms_name, 'wb')

    pickle.dump(parms_list, output_parms)
        
def LoadParms():
    parms_name = filedialog.askopenfilename(initialdir="/Users/Owner/Desktop/Python/cab databases/Parameters", title="Load Parameters", filetypes=(("Dat Files", "*.dat"),("All Files", "*.*")))

    if parms_name:
            y.delete(0, END)

            input_parm = open(parms_name, "rb")

            load_item = pickle.load(input_parm)

            for i in load_item:
                y.insert(END, i)

def DelParms():
    y.delete(0,END)
    

#---------------------------------------------------------------

#---------------------------------------------------------------
the_menu = Menu(root)
root.config(menu = the_menu)
#^^^^^^^^^^
file_menu =  Menu(the_menu, tearoff=False)
the_menu.add_cascade(label="File", menu= file_menu)
#^^^^^^^^^^
file_menu.add_command(label="Save Parameters", command= SaveParms)
file_menu.add_command(label="Load Parameters", command= LoadParms)
file_menu.add_separator()
file_menu.add_command(label="Clear Parameters", command= DelParms)
#---------------------------------------------------------------

#---------------------------------------------------------------
y = Entry(frame, textvariable=toek)
y.pack(side=RIGHT)
yl= Label(frame, text = "1....")
yl.pack()

frame2 = LabelFrame(root)
frame2.pack()

x = Entry(frame2, textvariable= default_hgt)
x.pack(side=RIGHT)
xl= Label(frame2, text = "2....")
xl.pack()
#---------------------------------------------------------------



root.mainloop()

我知道这会涉及到一些for循环,但我想不出来。如果我尝试

for i in parms_list:
    parms_list =+ i.get()

在我得到的保存功能中

parms_list =+ i.get()
              ^^^^^
AttributeError: 'str' object has no attribute 'get'

PICKLE超出了我有限的知识范围。
我知道这里有一个简单的解决办法,我试过其他的方法但我不知所措。
谢谢祝你今天愉快
编辑:我已经为此工作了几天,这是我为“保存”功能提出的

if parms_name:
    if parms_name.endswith(".dat"):
        pass
    else:
        parms_name = f"{parms_name}.dat"

new_list = []
for i in entry_list:
    entry_name = [key for key, value in globals().items()  if  value == i]
    new_list += [(entry_name[0] + ".get()")]

# print(new_list)
# new_list = [y.get(), x.get()]

output_parms = open(parms_name, 'wb')

pickle.dump(new_list, output_parms)

所以我越来越接近,但“new_list”只是字符串,我需要它来运行变量的.get()函数,我会继续工作,但如果有任何帮助,我会很感激它,谢谢。

sqyvllje

sqyvllje1#

因此,就像生活中的大多数事情一样,做事情的方法不止一种。我使用.dat文件是因为我在教程中使用了它。在我一头撞到墙上并在其间做了研究之后,我最终使用了.ini(配置文件),以下是我的工作代码。

#---------------------------------------------------------------
import tkinter
from tkinter import *
from tkinter import filedialog
from tkinter import ttk
import sqlite3
from configparser import ConfigParser
import os
#---------------------------------------------------------------

#---------------------------------------------------------------
root = Tk()
root.title("Cabinet Cut List Calculator")

frame = LabelFrame(root)
frame.pack()
#---------------------------------------------------------------

#---------------------------------------------------------------
toek = DoubleVar(value=3.5)
default_hgt = IntVar(value=42)
#---------------------------------------------------------------

#---------------------------------------------------------------
def SaveParms():
    save_name = filedialog.asksaveasfilename(initialdir="/Users/Owner/Desktop/Python/cab databases/Parameters", title="Save Parameters", filetypes=(("ini Files", "*.ini"),("All Files", "*.*")))

    if save_name:
        if save_name.endswith(".ini"):
            pass
        else:
            save_name = f"{save_name}.ini"

    parser = ConfigParser()
    def write_file():
        if save_name:
            parser.write(open(save_name, 'w'))

    if not os.path.exists(save_name):
        parser['parameters'] = {'var1': y.get(), 'var2': x.get()}

        write_file()
        
def LoadParms():
    load_name = filedialog.askopenfilename(initialdir="/Users/Owner/Desktop/Python//cab databases/Parameters", title="Load Parameters", filetypes=(("ini Files", "*.ini"),("All Files", "*.*")))

    if load_name:
        parser = ConfigParser()
        parser.read(load_name)
        saved_toek = parser.get('parameters', 'var1')
        saved_default_hgt = parser.get('parameters', 'var2')
        saved_toek = DoubleVar(value = saved_toek)
        saved_default_hgt = IntVar(value = saved_default_hgt)

        y.configure(textvariable=saved_toek)
        x.configure(textvariable=saved_default_hgt)

def DelParms():
    y.delete(0,END)
    x.delete(0,END)

#---------------------------------------------------------------

#---------------------------------------------------------------
the_menu = Menu(root)
root.config(menu = the_menu)
#^^^^^^^^^^
file_menu =  Menu(the_menu, tearoff=False)
the_menu.add_cascade(label="File", menu= file_menu)
#^^^^^^^^^^
file_menu.add_command(label="Save Parameters", command= SaveParms)
file_menu.add_command(label="Load Parameters", command= LoadParms)
file_menu.add_separator()
file_menu.add_command(label="Clear Parameters", command= DelParms)
#---------------------------------------------------------------

#---------------------------------------------------------------
y = Entry(frame, textvariable=toek)
y.pack(side=RIGHT)
yl= Label(frame, text = "1....")
yl.pack()

frame2 = LabelFrame(root)
frame2.pack()

x = Entry(frame2, textvariable= default_hgt)
x.pack(side=RIGHT)
xl= Label(frame2, text = "2....")
xl.pack()
#---------------------------------------------------------------

root.mainloop()

相关问题