【问题标题】:Using external class methods inside the imported module在导入的模块中使用外部类方法
【发布时间】:2016-10-17 12:33:18
【问题描述】:

我的 python 应用程序由各种独立处理算法/模块组成,这些算法/模块组合在一个 (Py)Qt GUI 中以便于访问。

每个处理算法都位于其自己的模块中,与 GUI 元素的所有通信都在主模块的单个类中实现。 特别是,这个 GUI 类有一个进度条 (QProgressBar) 对象,旨在表示所选算法的当前处理进度。 该对象具有.setValue() 方法(self.dlg.progressBar.setValue(int))。

问题在于,由于self.dlg.progressBar.setValue() 是一个类方法,我无法在导入的处理模块中使用它在自己的代码中报告它们的进度状态

我找到的唯一解决方法是在每个处理模块的定义中添加progressbar变量,在主模块内部传递self.dlg.progressBar,然后在处理模块内部盲目调用progressbar.setValue(%some_processing_var%)

这是在导入模块中使用外部类方法的唯一方法还是有更好的方法?

【问题讨论】:

    标签: python qt class module pyqt


    【解决方案1】:

    没有。我认为这种方法在某种程度上违反了软件工程原则(例如single responsibility)。在单一职责原则下,每个模块只负责其分配的任务,不负责其他任何事情。如果我们将 UI 视为一个单独的层,那么您的处理模块应该与 UI 层没有任何关系。

    在这种情况下,您的模块应该有一个名为publish_progress(callback) 的方法,其中callback 是一个为每个进度步骤调用的函数(more info)。然后,在您的 UI 层中定义一个函数,该函数被赋予一个整数(介于 0 到 100 之间)并更新进度条。一旦你定义了它,你应该用你的模块的publish_progress方法注册它。

    def progress_callback(prg):
        self.dlg.progressBar.setValue(prg)
    

    注册:

    my_module.publish_progress(progress_callback)
    

    在你的模块中调用回调:

    progress_callback(0)
    ...
    # do something
    ...
    progress_callback(20)
    ...
    # do something
    ...
    progress_callback(100)
    

    【讨论】:

    • @hi-im-frogatto 我想我明白了,但仍有一些我不明白的地方。 1。主(GUI)模块: a) 如果我必须在我的 GUI 类中定义 progress_callback,为什么定义中没有 self? b)我必须在主代码中的哪个位置放置注册语句? 2。处理模块: a) 我应该在处理函数中定义publish_progress 还是作为单独的方法? b) 根据您的回复,所有实际工作都由我从主模块导入的progress_callback 完成。那么这个publish_progress方法应该做什么呢?
    • @Vasily 1.a: 不,progress_callback 不应该是Main 类的方法。相反,它是一个本地函数,可以在 main 的方法之一中定义。 1.b: 注册语句可以在 UI 初始化之后(或其他地方)。 2.a: 可以是处理类的方法。 (或模块的功能)。 2.b: publish_progress 只是一个注册函数/方法,没有其他任何作用。如果仍有不清楚的地方,请随时提问。
    • @Vasily 这种方法是一种回调模式。 Check it out at Wikipedia.
    • @hi-im-frogatto 是的,我读过wikithisthis,但我仍然无法理解the_caller - the_callback 的关系。我看到你已经非常详细地解释了这一切,但是由于这是我第一次使用它,所以仍然很难实现。但是我知道学习是一件非常重要的事情,所以无论我多么愚蠢,我都不会放弃;)
    • Here 我用一个简单但详细的代码版本打开了另一个问题。我相信如果我可以显示整张图片会更容易一些。谢谢你的帮助,当我终于完全理解它时,我相信我会自嘲。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2010-11-25
    • 2016-11-13
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多