如何从另一个继承的tkinter类访问一个继承的tkinter类中的方法

时间:2015-07-01 20:03:26

标签: python user-interface inheritance tkinter

之前我使用过tkinter进行过编程,但通常做了一个很长的过程GUI类,它实现了我创建的其他非GUI类。这次我想用更多的OOP来实现它,使其更加模块化。

我遇到了一个问题,我已经找到了答案并且没有找到任何答案,这通常意味着它要么真的很容易,要么我真的错了。我从tk.LabelFrame创建了一个继承的类,并在其中创建了GUI小部件。我也有方法来操作类中的小部件,但我无法弄清楚如何在另一个继承的类中执行一个函数,部分原因是我无法弄清楚如何从另一个类(具有tkinter)正确实例化一个对象('parent')对象作为参数)。

我会通过重载构造函数来实现吗?我已经看过@classmethods和* args,** kwargs,但没有采取行动,因为我不确定这是不是正确的路线。关于在python中实现重载构造函数的最佳/正确方法存在争议。对于我正在努力完成的事情,我最难以理解的是什么......

由于

#python 2.7 on win7
import Tkinter as tk

class Testing(tk.LabelFrame):
    buttonwidth = 10

    def __init__(self, parent):

        self.parent=parent
        #results = Results(???) #<-- Don't know how to instantiate Results object

        tk.LabelFrame.__init__(self, self.parent, 
            text="Test Operations",
            padx=10,
            pady=10,
        )

        self.taskButton = tk.Button(
            self, 
            text="Do A Task", 
            width=self.buttonWidth,
            command=self.doATask,
        )

        self.taskButton.pack()

    def doATask(self):
        #want to execute function in Results.getResult() but don't know how
        #results.getResults()  #<--what I want to do
        print("place holder")

class Results(tk.LabelFrame):

    def __init__(self, parent):
        self.parent = parent
        tk.LabelFrame.__init__(self, self.parent, text="Visual Results")

        self.resultLbl = tk.Label(self, text="Result")

        self.resultLbl.pack()

    def getResult(self):
        self.resultLbl.configure(bg='yellow')



class Application(tk.Frame):

    def __init__(self, parent):
        self.parent = parent
        tk.Frame.__init__(self, self.parent)

        self.Testing = Testing(self.parent)
        self.Results = Results(self.parent)

        self.Testing.pack(fill=tk.X)
        self.Results.pack(fill=tk.X)

if __name__ == "__main__":
    root = tk.Tk()
    root.title("Modular GUI App")

    Application(root).pack()
    root.mainloop()

2 个答案:

答案 0 :(得分:1)

我建议坚持为每个单独的对象创建的实例变量,而不是在所有类的实例化之间共享的类变量 - 只需在self.之前添加这些变量名称(例如{{1} })。此外,坚持使用命名约定,因此您没有self.results类和该类的Testing对象。

根据Testing实例化对象。 __init__类的Results定义为__init__,因此需要父级。如果您希望它与创建它的def __init__(self, parent):对象具有相同的父级,只需执行Testing。但是,您不希望这样做(见下文)。

我在进行上述更改后遇到的一个问题是results = Results(parent)类实例化了自己的Application对象,这实际上是显示的,而不是{{1对象。请返回该对象,而不是创建新对象。将Results对象传递给每个类,以便它们可以相互引用。现在,说到这一点,通常最好让每个类尽可能少地了解其他类,这样在一个类中进行更改不需要在其他类中进行任何更改。

单击按钮时,以下代码将使标签变为黄色。

Testing

答案 1 :(得分:0)

这对我有用

Results(None,None).getResult()

好运!