Python 3.x 酸洗后无法绑定函数-tkinter

Python 3.x 酸洗后无法绑定函数-tkinter,python-3.x,tkinter,pickle,Python 3.x,Tkinter,Pickle,我有一个简单的代码,它通过按下按钮创建两个字段。还有另外两个按钮用于保存和加载创建的输入字段。我使用了bind功能来绑定字段A和字段B。输入数字后按字段A上的Enter按钮将打印出其值乘以字段B中的5。此时,绑定功能工作正常 当我创建三个输入字段并保存进度而不输入任何输入并编译程序,然后加载文件时,bind函数似乎不起作用。它似乎只适用于最后创建的字段。我的代码如下。我尽力简化代码 from tkinter import * from tkinter.filedialog import asko

我有一个简单的代码,它通过按下按钮创建两个字段。还有另外两个按钮用于保存和加载创建的输入字段。我使用了
bind
功能来绑定字段A和字段B。输入数字后按字段A上的Enter按钮将打印出其值乘以字段B中的5。此时,绑定功能工作正常

当我创建三个输入字段并保存进度而不输入任何输入并编译程序,然后加载文件时,bind函数似乎不起作用。它似乎只适用于最后创建的字段。我的代码如下。我尽力简化代码

from tkinter import *
from tkinter.filedialog import askopenfilename
from tkinter.filedialog import asksaveasfile
from tkinter import messagebox
import pickle

class Test(Frame):

    def Widgets(self):

        self.button_add = Button(self, text = "Add", command = self.add)
        self.button_add.grid(row=0, column =2)

        self.button_save = Button(self, text = "save", command = self.save)
        self.button_save.grid(row=0, column =3)

        self.button_load = Button(self, text = "load", command = self.load)
        self.button_load.grid(row=0, column =4)

    def add(self):

        def test(event):
            self.field_B[n].delete(0, END)
            self.field_B[n].insert(0, (float(self.field_A[n].get()))*5)

        self.field_A.append({})
        n = len(self.field_A)-1
        self.field_A[n] = Entry(self)
        self.field_A[n].grid(row=n, column =0)
        self.field_A[n].bind("<Return>", test)

        self.field_B.append({})
        n = len(self.field_B)-1
        self.field_B[n] = Entry(self)
        self.field_B[n].grid(row=n, column =1)

    def save(self):
        for n in range(len(self.field_A)):
            self.entry_A.append(self.field_A[n].get())
            self.entry_B.append(self.field_B[n].get())

        fname = asksaveasfile(mode = "w", defaultextension = ".est")
        data = {"fields": len(self.field_A), "entries_A": (self.entry_A),"entries_B": (self.entry_B)}

        with open(fname.name, "wb") as file:
            pickle.dump(data, file)

    def load(self):

        def test(event):
            print("Why is the value of n always equal to", n, "?")
            self.field_B[n].delete(0, END)
            self.field_B[n].insert(0, (float(self.field_A[n].get()))*5)

        fname = askopenfilename(filetypes = (("Estimation Files (est)", "*.est"),))
        location = fname.replace("/", "\\")
        if location:
            with open(location, "rb") as file:
                data = pickle.load(file)

            for n in range(data["fields"]):
                self.field_A.append({})
                self.field_A[n] = Entry(self)
                self.field_A[n].grid(row=n, column =0)
                self.field_A[n].insert(0, data["entries_A"][n])
                self.field_A[n].bind("<Return>", test)

                self.field_B.append({})
                self.field_B[n] = Entry(self)
                self.field_B[n].grid(row=n, column =1)
                self.field_B[n].insert(0, data["entries_B"][n])

    def __init__(self,master = None):
        Frame.__init__(self, master)
        self.field_A = []
        self.field_B = []
        self.entry_A = []
        self.entry_B = []
        self.grid()
        self.Widgets()

root = Tk()
app = Test(master = None)
app.mainloop()
从tkinter导入*
从tkinter.filedialog导入askopenfilename
从tkinter.filedialog导入asksaveasfile
从tkinter导入消息框
进口泡菜
等级测试(框架):
def小部件(自):
self.button\u add=button(self,text=“add”,command=self.add)
self.button\u add.grid(行=0,列=2)
self.button\u save=button(self,text=“save”,command=self.save)
self.button\u save.grid(行=0,列=3)
self.button\u load=button(self,text=“load”,command=self.load)
self.button\u load.grid(行=0,列=4)
def添加(自我):
def测试(事件):
self.field_B[n]。删除(0,结束)
self.field_B[n].insert(0,(float(self.field_A[n].get())*5)
self.field_A.append({})
n=透镜(自场_A)-1
self.field_A[n]=条目(self)
self.field_A[n]。网格(行=n,列=0)
self.field_A[n].bind(“,test)
self.field_B.append({})
n=len(自场_B)-1
self.field_B[n]=条目(self)
self.field_B[n]。网格(行=n,列=1)
def保存(自我):
对于范围内的n(len(self.field_A)):
self.entry\u A.append(self.field\u A[n].get())
self.entry_B.append(self.field_B[n].get())
fname=asksaveasfile(mode=“w”,defaultextension=“.est”)
数据={“字段”:len(self.field_A),“entries_A”:(self.entry_A),“entries_B”:(self.entry_B)}
打开(fname.name,“wb”)作为文件:
pickle.dump(数据、文件)
def加载(自):
def测试(事件):
打印(“为什么n的值总是等于”,n,”)
self.field_B[n]。删除(0,结束)
self.field_B[n].insert(0,(float(self.field_A[n].get())*5)
fname=askopenfilename(文件类型=((“估计文件(est)”,“*.est”),)
location=fname.replace(“/”,“\\”)
如果地点:
打开(位置“rb”)作为文件:
data=pickle.load(文件)
对于范围内的n(数据[“字段]):
self.field_A.append({})
self.field_A[n]=条目(self)
self.field_A[n]。网格(行=n,列=0)
self.field_A[n]。插入(0,数据[“entries_A”][n])
self.field_A[n].bind(“,test)
self.field_B.append({})
self.field_B[n]=条目(self)
self.field_B[n]。网格(行=n,列=1)
self.field_B[n]。插入(0,数据[“entries_B”][n])
def uuu init uuu(self,master=None):
帧。\uuuu初始化(自,主)
self.field_A=[]
self.field_B=[]
self.entry_A=[]
self.entry_B=[]
self.grid()
self.Widgets()
root=Tk()
应用程序=测试(主程序=无)
app.mainloop()
您需要“关闭”。您可以使用
functools.partial
函数在python中创建闭包

from functools import partial

def test(n, event=None):
    self.field_B[n].delete(0, END)
    self.field_B[n].insert(0, (float(self.field_A[n].get()))*5)

#other code ... 

self.field_A[n].bind("<Return>", partial(test, n))
从functools导入部分
def测试(n,事件=无):
self.field_B[n]。删除(0,结束)
self.field_B[n].insert(0,(float(self.field_A[n].get())*5)
#其他代码。。。
self.field_A[n].bind(“”,partial(test,n))
您需要“关闭”。您可以使用
functools.partial
函数在python中创建闭包

from functools import partial

def test(n, event=None):
    self.field_B[n].delete(0, END)
    self.field_B[n].insert(0, (float(self.field_A[n].get()))*5)

#other code ... 

self.field_A[n].bind("<Return>", partial(test, n))
从functools导入部分
def测试(n,事件=无):
self.field_B[n]。删除(0,结束)
self.field_B[n].insert(0,(float(self.field_A[n].get())*5)
#其他代码。。。
self.field_A[n].bind(“”,partial(test,n))
两个
test()
函数都在从封闭函数访问变量
n
。在
add()
的情况下,没有循环<代码>n只有一个值。每个条目的
test()
都有自己的
n
,因为它们被对
add()
的不同调用绑定。然而,在
load()
中,您在
n
值上循环;每个
test()
都引用同一个
n
,在调用任何绑定时都将有其最终值。另一个答案给出了一种合理的方法,可以为
test()
的每个实例提供它自己的
n
,因此我不在这里重复。

您的
test()
函数都在从封闭函数访问变量
n
。在
add()
的情况下,没有循环<代码>n只有一个值。每个条目的
test()
都有自己的
n
,因为它们被对
add()
的不同调用绑定。然而,在
load()
中,您在
n
值上循环;每个
test()
都引用同一个
n
,在调用任何绑定时都将有其最终值。另一个答案给出了一种合理的方法,可以为
test()
的每个实例提供它自己的
n
,因此我在这里不再重复