请教一下各位,用 pyqt5 写的 GUI 模块引用业务模块,业务模块如何反过来影响 GUI 模块?

2020-10-15 16:48:25 +08:00
 chiyeung524

具体问题如下

我的需求:弄一个界面,用户通过界面操作,生成并启动一个线程,线程运行具体业务内容。

现有三个模块,分别是 业务模块 yw.py 、线程模块 thread.py 、界面模块 gui.py 常规的设计思路是界面模块 import 线程模块、线程模块 import 业务模块

现在遇到的问题是:我想在 GUi 界面加一个 textBrowser,用于显示业务模块运行时输出的内容(类似将控制台输出搬到 GUI 上),但是业务模块不能 import GUI 模块( python 禁止相互 import ),请问该怎么弄?

现有的不成熟思路: 1.逐层传递 GUi 实例:gui 模块调用 thread 模块时,将 gui 的实例传给 thread,thread 再传给业务模块,从而实现在业务模块操作 GUi (但是感觉有点麻烦) 2.自定义信号和槽:在 gui 模块定义槽,在业务模块里发送信号(但不知道跨模块发送信号可行性,好像也需要先传 gui 的实例吧?)

1799 次点击
所在节点    Python
8 条回复
iqxd
2020-10-15 16:59:27 +08:00
用信号槽应该不难实现吧,在 yw.pythread.py 新建类,继承自 QObject, 并在其中定义 signal emit 内容,在 gui.py 新建实例化 yw,thread 对象,并定义 slot 函数显示内容就行了吧
lpts007
2020-10-15 17:08:40 +08:00
“python 禁止相互 import”

import 位置往后放放就行了
lpts007
2020-10-15 17:10:43 +08:00
pyqt 问题 csdn 绰绰有余,都不用 google 出手
megachweng
2020-10-15 17:17:18 +08:00
你可以让 logging.hander 继承 QObject handler 的 emit 方法发射 qtsignal 具体实现可以参考我之前的一个 SO 回答 https://stackoverflow.com/a/55059907/6725213
imn1
2020-10-15 17:20:53 +08:00
thread.py
class SearchDbThread(QtCore.QThread):
... outputText = QtCore.pyqtSignal(object)
... ……
... res = yw.search(param)
... self.outputText.emit(res) # 发送结果

gui.py
self.searchThread = thread.SearchDbThread(param)
self.searchThread.outputText.connect(self.handleSearchResult) # 接收结果

def handleSearchResult(self, res):
这里控制界面的变化

举例
pgbarValue = QtCore.pyqtSignal(int)
...
self.pgbarValue.emit(percent)
这个是控制进度条的,emit 发送不需要等函数结束,在 thread 中的循环内也能发送
imn1
2020-10-15 17:28:48 +08:00
另一个思路
yw 里面有个 class A 不方便改,改动会影响其他业务
可以在 thread 里面继承过来,class B(yw.A),这样在 thread 里面调用 B,并传参给 B 就可以了
chiyeung524
2020-10-15 18:38:07 +08:00
@lpts007 厉害,果然是脚本语言,疏忽了
chiyeung524
2020-10-15 18:41:38 +08:00
@iqxd 明白了,谢谢啦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/715306

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX