在导入的模块中使用外部类方法

Vas*_*ily 3 python qt module class pyqt

我的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%)在处理模块内盲目调用.

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

fro*_*tto 5

不,我认为这种方法在某种程度上打破了软件工程原则(例如单一责任)在单一责任原则中,每个模块仅负责其分配的任务而不是其他任何事项.如果我们将UI视为一个单独的层,那么您的处理模块不应该与UI层有任何关系.

在这种情况下,您的模块应该有一个调用的方法publish_progress(callback),该方法callback是为每个进度步骤调用的函数(更多信息).然后,在UI层中定义一个给定整数(介于0到100之间)的函数并更新进度条.一旦定义了它,就应该用publish_progress模块的方法注册它.

def progress_callback(prg):
    self.dlg.progressBar.setValue(prg)
Run Code Online (Sandbox Code Playgroud)

注册:

my_module.publish_progress(progress_callback)
Run Code Online (Sandbox Code Playgroud)

在模块中调用回调:

progress_callback(0)
...
# do something
...
progress_callback(20)
...
# do something
...
progress_callback(100)
Run Code Online (Sandbox Code Playgroud)