具体问题如下
我的需求:弄一个界面,用户通过界面操作,生成并启动一个线程,线程运行具体业务内容。
现有三个模块,分别是 业务模块 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 的实例吧?)
1
iqxd 2020-10-15 16:59:27 +08:00
|
2
lpts007 2020-10-15 17:08:40 +08:00 via Android
“python 禁止相互 import”
import 位置往后放放就行了 |
3
lpts007 2020-10-15 17:10:43 +08:00 via Android
pyqt 问题 csdn 绰绰有余,都不用 google 出手
|
4
megachweng 2020-10-15 17:17:18 +08:00 via iPhone
你可以让 logging.hander 继承 QObject handler 的 emit 方法发射 qtsignal 具体实现可以参考我之前的一个 SO 回答 https://stackoverflow.com/a/55059907/6725213
|
5
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 中的循环内也能发送 |
6
imn1 2020-10-15 17:28:48 +08:00
另一个思路
yw 里面有个 class A 不方便改,改动会影响其他业务 可以在 thread 里面继承过来,class B(yw.A),这样在 thread 里面调用 B,并传参给 B 就可以了 |
7
chiyeung524 OP @lpts007 厉害,果然是脚本语言,疏忽了
|
8
chiyeung524 OP @iqxd 明白了,谢谢啦
|