我的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%)
。
这是在导入模块中使用外部类方法的唯一方法还是有更好的方法?
答案 0 :(得分:5)
没有。我认为这种方法在某种程度上打破了软件工程原则(例如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)