Вы всегда должны будете сохранять ссылки на все объекты, которые вы хотите вызвать.Например, вы должны сохранить ссылку на экземпляр 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()