如何访问另一个tkinter-frame子类中的属性



我正在尝试访问frame_2中的self.var_1frame_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

由于在创建Frame1Frame2的实例时将Root的实例作为master传递,并且由于Root的实例具有对帧的引用,因此一种方法是保存对master:的引用

class Frame1(tk.Frame):   
def __init__(self, master):
super().__init__(master)
self.root = master
self.var_1 = 'Variable_1'

这样,就可以在Frame1Frame2中同时使用self.root.frame_1.var_1self.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问题,它只是面向对象编程的一个基本方面:要访问对象的属性,需要对该对象的引用。你可以让来电者把它传进来,也可以在需要的时候取它

相关内容

  • 没有找到相关文章

最新更新