Python tkinter:如何从另一个子对象调用子对象的方法

Python tkinter:如何从另一个子对象调用子对象的方法,python,class,inheritance,tkinter,Python,Class,Inheritance,Tkinter,这是我第一次使用pyhton创建图形界面,我很难理解父母和孩子之间的联系 我首先在一个单独的线程中创建根窗口: import tkinter as tk import threading as th class GUI(th.Thread): def __init__(self): th.Thread.__init__(self) self.root = tk.Tk() self.gp = MainFrame(self.root)

这是我第一次使用pyhton创建图形界面,我很难理解父母和孩子之间的联系

我首先在一个单独的线程中创建根窗口:

import tkinter as tk
import threading as th

class GUI(th.Thread):
    def __init__(self):
        th.Thread.__init__(self)
        self.root = tk.Tk()
        self.gp = MainFrame(self.root)

    def start(self):
        self.root.mainloop()

    def stop(self):
        self.root.destroy()
此类的构造函数调用主框架的构造函数:

class MainFrame(tk.Frame):
    def __init__(self,parent):
        tk.Frame.__init__(self,parent)
        self.x=my_label(self)
        self.up=my_update(self)
        self.grid()
在这个主框架中,我只有两个简单的元素,它们的类是:

class my_label(tk.Frame):
    def __init__(self,parent):
        tk.Frame.__init__(self,parent)
        self.l = tk.Label(self,text="some text")
        self.l.grid()
        self.grid()

class my_update(tk.Frame):
    def __init__(self,parent):
        tk.Frame.__init__(self,parent)

        self.b=tk.Button(self,text="update",command=self.ButtonPushed)
        self.b.grid()
        self.grid()

    def ButtonPushed(self):
        # here is my problem...
这样做是可行的,但是当我点击更新按钮时,我想修改
x
(在
大型机中)。换句话说,我想修改,从一个孩子,另一个家长的孩子。。。我该怎么做

附带问题:我的图形界面的总体结构似乎正确吗?我的意思是,让
my_update
my_label
tk.Frame
继承是否正确


<代码>类my_UUpdate(tk.Frame): 定义初始(自我、父母、朋友): # ^^^^^^ #将另一个子引用接受为'freind',另存为self.friend tk.Frame.\uuuu init\uuuuu(自,父)
self.friend=friend#对于你的附带问题:我不确定你的应用程序还需要做什么,所以可能有一个很好的理由,但在我看来,将标签和按钮包装在一个额外的类中,这个类继承自
Frame
,这会使事情变得有点复杂。我想我应该这样做:

class MainFrame(tk.Frame):
    def __init__(self,parent):
        tk.Frame.__init__(self,parent)
        self.x=tk.Label(self, text="some text")
        self.up=tk.Button(self, text="update", command=self.ButtonPushed)
        self.x.grid()
        self.up.grid()
        self.grid()

    def ButtonPushed(self):
        # do something with self.x

或者,如果您真的需要额外的类,为什么不让子类从tk.Label和tk.Button继承呢。不需要将它们包装在一个额外的框架中。

谢谢,您的方法很有效。但是当我读到你的答案时,我意识到我的程序的概念是错误的。。。所以我不需要你的解决方案。你帮助了我,让我知道我可以找到更好的编码方式!
class my_label(tk.Frame):
    def __init__(self,parent):
        tk.Frame.__init__(self,parent)
        self.l = tk.Label(self,text="some text")
        self.l.grid()
        self.grid()

    # my_update.ButtonPushed will call this method.
    def ButtonPushed(self):
        self.l['text'] = 'pushed'
class my_update(tk.Frame):
    def __init__(self,parent, friend):
        #                     ^^^^^^
        # accept another child reference as `freind` as save it as self.friend
        tk.Frame.__init__(self,parent)
        self.friend = friend # <-- save reference to another child

        self.b=tk.Button(self,text="update",command=self.ButtonPushed)
        self.b.grid()
        self.grid()

    def ButtonPushed(self):
        self.friend.ButtonPushed() # <-- call another child's method freely.
class MainFrame(tk.Frame):
    def __init__(self,parent):
        tk.Frame.__init__(self,parent)
        self.x=tk.Label(self, text="some text")
        self.up=tk.Button(self, text="update", command=self.ButtonPushed)
        self.x.grid()
        self.up.grid()
        self.grid()

    def ButtonPushed(self):
        # do something with self.x