我仍在学习如何使用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()
答案 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()