在被调用的类中引用调用类?

问题描述

我有两个 .py 文件一个 tkinter UI 文件一个后端文件。我希望从 UI 文件中的按钮事件调用函数,由后端处理,然后作为响应反映在 UI 中。例如:

主窗口文件

class Application(tk.Frame):
    def __init__(self,master=None):
        super().__init__(master)
        self.master = master
        self.loadDirectory = tk.Button(leftConsole,text = 'Load sort folder',command = lambda: backend.loadDirectory())

Aaaa 和后端:

class Backend(object):
    def __init__(self,master=None):
        super().__init__()
        self.master = master
    def loadDirectory(self):
        sort_folder_path = askdirectory(title='Select Folder to Sort')
        self.fileNameLabel.config(text = sort_folder_path)

它一直有效,直到我去尝试在调用类的小部件中配置文本。我弄乱了 super()init() 函数,颠倒哪个类调用哪个,等等,但我不能把这件事变成一条两条路。

解决方法

通常,您要么有一个控制器类,它充当可以返回类实例的中介,要么一个对象将自身传递给需要它的任何其他对象。

您没有在示例中显示类的构造位置或方式,但一个简单的方法就是将 app 的实例传递给任何需要它的函数:

class Application(tk.Frame):
    def __init__(self,master=None):
        ...
        self.loadDirectory = tk.Button(...,command = lambda: backend.loadDirectory(app=self))

class Backend(object):
    def loadDirectory(self,app):
        sort_folder_path = askdirectory(title='Select Folder to Sort')
        app.fileNameLabel.config(text = sort_folder_path)

使用控制器,它可能看起来像这样:

class Controller:
    def __init__(self,root):
        self.app = App(root,controller=self)
        self.backend = Backend(root,controller=self)

class Application(tk.Frame):
    def __init__(self,master=None,controller=None):
        ...
        self.controller = controller
        ...
        self.loadDirectory = tk.Button(...,command = self.controller.backend.loadDirectory)

class Backend(object):
    def __init__(self,root,controller):
        ...
        self.controller = controller
        ...

    def loadDirectory(self):
        sort_folder_path = askdirectory(title='Select Folder to Sort')
        self.controller.app.fileNameLabel.config(text = sort_folder_path)

root = tk.Tk()
controller = Controller(root)
,

您正在按钮上使用 lambda。 lambda 函数用于从它通常不提供的按钮传递信息。传递的信息被冻结。 所以更改信息不会有任何影响。