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
,因此我在这里不再重复