Tkinter父子数据交换

任何

我希望这不是一个重复的问题,因为这里已经提出一个解决方案,我很难让它起作用。(或者,我可以将其发布在同一讨论中)

目标:

用户在主窗口中输入一些数据,如果单击,则会出现一个带有父数据的新子窗口,最终对其进行操作,然后将结果发送回父窗口小部件。

在此处输入图片说明

使用的代码:

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'
布莱恩·奥克利(Bryan Oakley)

错误消息告诉您问题出在哪里:它说trackApp没有属性'app',而查看该类的定义时,我看不到任何属性'app'

为了让您的子窗口知道它是父窗口,您需要为其提供对父窗口的引用。因此,在创建窗口时,您要传递参考,在子窗口中,您应使用参考。

看起来您正在尝试执行此操作,但是您传递了错误的值,然后就没有使用该值。您需要将代码修改为如下所示:

class trackApp(Frame):
    ...
def dialogWindow(self):
    ...
    childDialog=childWindow(top,mainList, self)

class childWindow(Frame):
    def childDestroy(self):
        ...
        self.app.new_data(self, self.data) 
        ... 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Tkinter父子数据交换

来自分类Dev

Bootstrap数据交换?

来自分类Dev

数据交换-Python和Fortran

来自分类Dev

iOS应用双向数据交换

来自分类Dev

与旧版程序进行数据交换

来自分类Dev

数据交换格式和Java序列化

来自分类Dev

application / ld + json和javascript数据交换

来自分类Dev

R和python之间的数据交换(music21)

来自分类Dev

macOS捆绑包之间的双向数据交换(快速)

来自分类Dev

WCF配置元数据交换和帮助页面端点

来自分类Dev

NFC数据交换格式的Ndef记录创建

来自分类Dev

2个应用程序之间的数据交换

来自分类Dev

计算Java冒泡排序中的数据交换数量

来自分类Dev

Android Wearable和Handheld之间的实时数据交换

来自分类Dev

服务到服务数据交换的最简单架构

来自分类Dev

p2p直接数据交换...通过HTTPS?

来自分类Dev

application / ld + json和javascript数据交换

来自分类Dev

数据库或消息队列,用于两个应用程序之间的数据交换

来自分类Dev

Java(Spring应用程序)与C#之间的数据交换

来自分类Dev

使用带有ZURB基础数据交换的jquery延迟加载插件

来自分类Dev

QUICKBOOKS_ADD_CUSTOMER函数不会触发(“无数据交换”)

来自分类Dev

生态系统元数据交换工具无法与sysdev.microsoft.com同步

来自分类Dev

为什么在CPU和GPU内存之间的数据交换这么慢?

来自分类Dev

Java-chess游戏,从GUI到其他类的数据交换

来自分类Dev

为什么在CPU和GPU内存之间的数据交换这么慢?

来自分类Dev

Node.js:服务器和客户端之间的数据交换

来自分类Dev

获取“缺少数据提供程序或数据包”错误 - 在 clientdataset 中将数据交换为流

来自分类Dev

为什么Microsoft生态系统元数据交换在Windows 10上要求管理员提升权限?

来自分类Dev

在微服务环境中使用强类型数据交换格式(例如节俭/ capn原型)的实际缺点是什么?

Related 相关文章

  1. 1

    Tkinter父子数据交换

  2. 2

    Bootstrap数据交换?

  3. 3

    数据交换-Python和Fortran

  4. 4

    iOS应用双向数据交换

  5. 5

    与旧版程序进行数据交换

  6. 6

    数据交换格式和Java序列化

  7. 7

    application / ld + json和javascript数据交换

  8. 8

    R和python之间的数据交换(music21)

  9. 9

    macOS捆绑包之间的双向数据交换(快速)

  10. 10

    WCF配置元数据交换和帮助页面端点

  11. 11

    NFC数据交换格式的Ndef记录创建

  12. 12

    2个应用程序之间的数据交换

  13. 13

    计算Java冒泡排序中的数据交换数量

  14. 14

    Android Wearable和Handheld之间的实时数据交换

  15. 15

    服务到服务数据交换的最简单架构

  16. 16

    p2p直接数据交换...通过HTTPS?

  17. 17

    application / ld + json和javascript数据交换

  18. 18

    数据库或消息队列,用于两个应用程序之间的数据交换

  19. 19

    Java(Spring应用程序)与C#之间的数据交换

  20. 20

    使用带有ZURB基础数据交换的jquery延迟加载插件

  21. 21

    QUICKBOOKS_ADD_CUSTOMER函数不会触发(“无数据交换”)

  22. 22

    生态系统元数据交换工具无法与sysdev.microsoft.com同步

  23. 23

    为什么在CPU和GPU内存之间的数据交换这么慢?

  24. 24

    Java-chess游戏,从GUI到其他类的数据交换

  25. 25

    为什么在CPU和GPU内存之间的数据交换这么慢?

  26. 26

    Node.js:服务器和客户端之间的数据交换

  27. 27

    获取“缺少数据提供程序或数据包”错误 - 在 clientdataset 中将数据交换为流

  28. 28

    为什么Microsoft生态系统元数据交换在Windows 10上要求管理员提升权限?

  29. 29

    在微服务环境中使用强类型数据交换格式(例如节俭/ capn原型)的实际缺点是什么?

热门标签

归档