如何从tkinter的其他类中获取函数和变量?

时间:2018-12-16 04:41:02

标签: python tkinter

我仍在学习如何使用tkniter和类。当涉及到tkniter时,我正在努力寻找一种访问不同类中的函数和变量的方法。我想在类test3中添加一个按钮,该按钮从类test_function调用函数test2,并且我想将self.x的值从1增加类test1内部的类test3。任何帮助将不胜感激。

import tkinter as tk

class main(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)

        container = tk.Frame(self)
        container.grid()

        n = 0
        for f in (test1, test2, test3):
            frame = f(container)
            frame grid(row=1, column=n, rowspan=3)
            n=+1


class test1(tk.Frame):

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

        self.x = -1


class test2(tk.Frame):

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

    def test_function(self):
        print("test")


class test3(tk.Frame):

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


if __name__=="__main__":
    app = main()
    app.mainloop()

1 个答案:

答案 0 :(得分:0)

您将始终必须保留对要调用的所有对象的引用。例如,您必须保存对test2()实例的引用,才能调用test_function()方法。我在self.instance_list中进行此操作。

这也反过来了; test3()实例必须具有对其创建者的引用,我在调用中将其传递给frame = f(container, self)。由于只有test3()需要引用,因此我让其他类都放弃了该引用。

然后,您必须以正确的方式调用所需的函数。在这种情况下,您可能需要稍作试验,直到您可以使用它。我知道但是在这里,我需要一个主控从属实例的函数:

command=master.instance_list[1].test_function
#       master      slave         function 

或检查整个应用程序:

import tkinter as tk

class main(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        container = tk.Frame(self, bg='thistle')
        container.grid()
        n = 0
        self.instance_list = [] # Create list to save ref to instances
        for f in (test1, test2, test3):
            frame = f(container, self)  # Pass self to instance 
            frame.grid(row=1, column=n, rowspan=3)
            self.instance_list.append(frame) # Save ref to list
            n =+ 1

class test1(tk.Frame):
    def __init__(self, parent, _):
        tk.Frame.__init__(self, parent)
        self.x = -1

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

    def test_function(self):
        print("test")

class test3(tk.Frame):
    def __init__(self, parent, master):
        tk.Frame.__init__(self, parent)
        b = tk.Button(self, text='QA',
                  command=master.instance_list[1].test_function)
        b.pack(padx=20, pady=20)

if __name__=="__main__":
    app = main()
    app.mainloop()