微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在被调用的类中引用调用类?

我有两个 .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 函数用于从它通常不提供的按钮传递信息。传递的信息被冻结。 所以更改信息不会有任何影响。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。