tkinter:如何从另一个孩子调用孩子的方法

时间:2013-09-11 15:26:55

标签: 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)

    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(在MainFrame中)。换句话说,我想从孩子那里修改另一个父母的孩子......我怎么能这样做?

附带问题:我的图形界面的一般构造是否正确?我的意思是,让my_updatemy_label继承自tk.Frame是否正确?

2 个答案:

答案 0 :(得分:0)

请尝试以下操作:(请参阅注释以查看我修改的内容。)

class MainFrame(tk.Frame):
    def __init__(self,parent):
        tk.Frame.__init__(self,parent)
        self.x=my_label(self)
        self.up=my_update(self, self.x) # <-- pass another child to constructor
        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()

    # 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.

答案 1 :(得分:0)

对于你的旁边问题:我不确定你的应用程序还需要做什么,所以也许有一个很好的理由,但在我看来,将标签和按钮包装在一个继承自{{1过度使事情复杂化了一些。我想我会这样做:

Frame

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