我正在尝试访问frame_2
中的self.var_1
和frame_1
中的self.var_2
?
这是我的密码。
import tkinter as tk
class Root(tk.Tk):
def __init__(self):
super().__init__()
self.frame_1 = Frame1(self)
self.frame_1.pack()
self.frame_2 = Frame2(self)
self.frame_2.pack()
class Frame1(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.var_1 = 'Variable_1'
class Frame2(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.var_2 = 'Variable_2'
if __name__ == '__main__':
root = Root()
root.mainloop()
我试过了。
class Frame2(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.var_2 = 'Variable_2'
self.var_1 = self.master.frame_1.var_1
但它不适用于Frame1
,因为self.master.frame_2.var_2
是未定义的。
class Frame1(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.var_1 = 'Variable_1'
self.var_2 = self.master.frame_2.var_2
由于在创建Frame1
和Frame2
的实例时将Root
的实例作为master传递,并且由于Root
的实例具有对帧的引用,因此一种方法是保存对master
:的引用
class Frame1(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.root = master
self.var_1 = 'Variable_1'
这样,就可以在Frame1
和Frame2
中同时使用self.root.frame_1.var_1
和self.root.frame_2.var_2
。
另一种解决方案可能是向Root
添加一个方法,该方法返回一个或两个帧。例如,您可以这样定义get_frames
:
class Root:
...
def get_frames(self):
return self.frame_1, self.frame_2
然后,您可以调用此方法来获取帧,然后使用帧来获取变量:
frame1, frame2 = self.root.get_frames()
print(frame1.var_1)
基于这个简单的例子,很难说哪种解决方案是最好的。无论如何,这不是tkinter问题,它只是面向对象编程的一个基本方面:要访问对象的属性,需要对该对象的引用。你可以让来电者把它传进来,也可以在需要的时候取它