Tkinter 父子数据交换
Tkinter parent to child data exchange
我希望这不是一个重复的问题,因为已经提出了解决方案 here,我很难让它发挥作用。 (或者我可以 post 在同一个讨论中)
目标:
主要window用户输入一些数据,如果点击,一个新的子window出现,带有父数据,最终对它们进行操作,然后将结果发送回父部件。
使用的代码:
from Tkinter import *
class trackApp(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.mainVar1 = IntVar()
self.mainVar2 = IntVar()
self.mainVar1.set(100)
self.mainVar2.set(100)
self.master = master
self.master.geometry('400x200+100+200')
self.master.title('MAIN WINDOW')
self.label1=Label(self.master,text='Variable1 : ').grid(row=1,column=1)
self.mainEntry1=Entry(self.master,textvariable=self.mainVar1).grid(row=1,column=2)
self.label2=Label(self.master,text='Variable2 : ').grid(row=2,column=1)
self.mainEntry2=Entry(self.master,textvariable=self.mainVar2).grid(row=2,column=2)
self.button1=Button(self.master,text='Child',command=self.dialogWindow).grid(row=7,column=2)
def new_data(self, data):
self.mainEntry1.delete(0,END)
self.mainEntry1.insert(0,self.data['var1'])
self.mainEntry2.delete(0,END)
self.mainEntry2.insert(0,self.data['var2'])
def dialogWindow(self):
# Build a list from control variables used in the main window text entry boxes
mainList = [self.mainVar1.get(),self.mainVar2.get()]
top=Toplevel(self.master)
childDialog=childWindow(top,mainList, self.master)
class childWindow(Frame):
# Pass data (list) to the child
def __init__(self, master, list, app):
self.list = list
self.app = app
self.master = master
self.master.geometry('300x100+150+250')
self.master.title('CHILD WINDOW')
# Define control variabels to be used with child window text entry widgets
self.childvar1 = IntVar()
self.childvar2 = IntVar()
# Fill child window text entry widgets with inf. from parent window
self.childvar1.set(list[0])
self.childvar2.set(list[1])
# Text entry widgets
self.label1=Label(self.master,text='Enter New value 1').grid(row=0,column=1)
self.childEntry1=Entry(self.master,textvariable=self.childvar1).grid(row=0,column=2)
self.label2=Label(self.master,text='Enter New value 2').grid(row=1,column=1)
self.childEntry2=Entry(self.master,textvariable=self.childvar2).grid(row=1,column=2)
self.button1=Button(self.master,text='OK',command=self.childDestroy).grid(row=3,column=1)
def childDestroy(self):
self.data = {}
self.data['var1'] = self.childvar1.get()
self.data['var2'] = self.childvar2.get()
trackApp.app.new_data(self, self.data) # <<<<<<<<< How to call the parent new_data method
self.master.destroy()
def main():
root = Tk()
app = trackApp(root)
root.mainloop()
if __name__ == "__main__":
main()
问题:
如何从子引用父方法(new_data)?
错误:
/usr/bin/python2.7 /<path>/child-dialog.py
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1489, in __call__
return self.func(*args)
File "/<path>/child-dialog.py", line 77, in childDestroy
trackApp.app.new_data(self, self.data) # <<<<<<<<< How to call the parent new_data method
AttributeError: class trackApp has no attribute 'app'
错误消息准确地告诉您问题出在哪里:它说 trackApp
没有属性 'app'
,查看 class 的定义我看不到任何属性'app'
。
为了让 child window 知道它是 parent,您需要给它一个 parent 的引用。因此,在创建 window 时传递引用,并在 child window 中使用引用。
看起来您正在尝试这样做,但您传递了错误的值,然后您就没有使用该值。您需要将代码修改为如下所示:
class trackApp(Frame):
...
def dialogWindow(self):
...
childDialog=childWindow(top,mainList, self)
class childWindow(Frame):
def childDestroy(self):
...
self.app.new_data(self, self.data)
...
感谢布莱恩的回答。以下是我相应做出的更改:
将父项(自身)传递给子项window
def dialogWindow(self):
childDialog=childWindow(top,mainList, self)
使用父实例(自身)调用父方法
def childDestroy(self)
self.app.new_data(self.data)
和以下更新主要 window 小部件:
def new_data(self, data):
self.mainVar1.set(data['var1'])
self.mainVar2.set(data['var2'])
感谢您的帮助。
我希望这不是一个重复的问题,因为已经提出了解决方案 here,我很难让它发挥作用。 (或者我可以 post 在同一个讨论中)
目标:
主要window用户输入一些数据,如果点击,一个新的子window出现,带有父数据,最终对它们进行操作,然后将结果发送回父部件。
使用的代码:
from Tkinter import *
class trackApp(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.mainVar1 = IntVar()
self.mainVar2 = IntVar()
self.mainVar1.set(100)
self.mainVar2.set(100)
self.master = master
self.master.geometry('400x200+100+200')
self.master.title('MAIN WINDOW')
self.label1=Label(self.master,text='Variable1 : ').grid(row=1,column=1)
self.mainEntry1=Entry(self.master,textvariable=self.mainVar1).grid(row=1,column=2)
self.label2=Label(self.master,text='Variable2 : ').grid(row=2,column=1)
self.mainEntry2=Entry(self.master,textvariable=self.mainVar2).grid(row=2,column=2)
self.button1=Button(self.master,text='Child',command=self.dialogWindow).grid(row=7,column=2)
def new_data(self, data):
self.mainEntry1.delete(0,END)
self.mainEntry1.insert(0,self.data['var1'])
self.mainEntry2.delete(0,END)
self.mainEntry2.insert(0,self.data['var2'])
def dialogWindow(self):
# Build a list from control variables used in the main window text entry boxes
mainList = [self.mainVar1.get(),self.mainVar2.get()]
top=Toplevel(self.master)
childDialog=childWindow(top,mainList, self.master)
class childWindow(Frame):
# Pass data (list) to the child
def __init__(self, master, list, app):
self.list = list
self.app = app
self.master = master
self.master.geometry('300x100+150+250')
self.master.title('CHILD WINDOW')
# Define control variabels to be used with child window text entry widgets
self.childvar1 = IntVar()
self.childvar2 = IntVar()
# Fill child window text entry widgets with inf. from parent window
self.childvar1.set(list[0])
self.childvar2.set(list[1])
# Text entry widgets
self.label1=Label(self.master,text='Enter New value 1').grid(row=0,column=1)
self.childEntry1=Entry(self.master,textvariable=self.childvar1).grid(row=0,column=2)
self.label2=Label(self.master,text='Enter New value 2').grid(row=1,column=1)
self.childEntry2=Entry(self.master,textvariable=self.childvar2).grid(row=1,column=2)
self.button1=Button(self.master,text='OK',command=self.childDestroy).grid(row=3,column=1)
def childDestroy(self):
self.data = {}
self.data['var1'] = self.childvar1.get()
self.data['var2'] = self.childvar2.get()
trackApp.app.new_data(self, self.data) # <<<<<<<<< How to call the parent new_data method
self.master.destroy()
def main():
root = Tk()
app = trackApp(root)
root.mainloop()
if __name__ == "__main__":
main()
问题:
如何从子引用父方法(new_data)?
错误:
/usr/bin/python2.7 /<path>/child-dialog.py
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1489, in __call__
return self.func(*args)
File "/<path>/child-dialog.py", line 77, in childDestroy
trackApp.app.new_data(self, self.data) # <<<<<<<<< How to call the parent new_data method
AttributeError: class trackApp has no attribute 'app'
错误消息准确地告诉您问题出在哪里:它说 trackApp
没有属性 'app'
,查看 class 的定义我看不到任何属性'app'
。
为了让 child window 知道它是 parent,您需要给它一个 parent 的引用。因此,在创建 window 时传递引用,并在 child window 中使用引用。
看起来您正在尝试这样做,但您传递了错误的值,然后您就没有使用该值。您需要将代码修改为如下所示:
class trackApp(Frame):
...
def dialogWindow(self):
...
childDialog=childWindow(top,mainList, self)
class childWindow(Frame):
def childDestroy(self):
...
self.app.new_data(self, self.data)
...
感谢布莱恩的回答。以下是我相应做出的更改:
将父项(自身)传递给子项window
def dialogWindow(self):
childDialog=childWindow(top,mainList, self)
使用父实例(自身)调用父方法
def childDestroy(self)
self.app.new_data(self.data)
和以下更新主要 window 小部件:
def new_data(self, data):
self.mainVar1.set(data['var1'])
self.mainVar2.set(data['var2'])
感谢您的帮助。