V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
chiyeung524
V2EX  ›  Python

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

  •  
  •   chiyeung524 · 2020-10-15 16:48:25 +08:00 · 1767 次点击
    这是一个创建于 1260 天前的主题,其中的信息可能已经有所发展或是发生改变。

    具体问题如下

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

    现有三个模块,分别是 业务模块 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 的实例吧?)

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

    import 位置往后放放就行了
    lpts007
        3
    lpts007  
       2020-10-15 17:10:43 +08:00 via Android
    pyqt 问题 csdn 绰绰有余,都不用 google 出手
    megachweng
        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
    imn1
        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 中的循环内也能发送
    imn1
        6
    imn1  
       2020-10-15 17:28:48 +08:00
    另一个思路
    yw 里面有个 class A 不方便改,改动会影响其他业务
    可以在 thread 里面继承过来,class B(yw.A),这样在 thread 里面调用 B,并传参给 B 就可以了
    chiyeung524
        7
    chiyeung524  
    OP
       2020-10-15 18:38:07 +08:00
    @lpts007 厉害,果然是脚本语言,疏忽了
    chiyeung524
        8
    chiyeung524  
    OP
       2020-10-15 18:41:38 +08:00
    @iqxd 明白了,谢谢啦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3268 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 14:11 · PVG 22:11 · LAX 07:11 · JFK 10:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.