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
xwyam
V2EX  ›  Python

PyQt5 使用了 QThread 分离 UI 和逻辑,结果 UI 还是会卡住

  •  
  •   xwyam · 2018-04-22 15:26:53 +08:00 · 5421 次点击
    这是一个创建于 2407 天前的主题,其中的信息可能已经有所发展或是发生改变。
    class Ux(QMainWindow, window.Ui_MainWindow):
        @pyqtSlot()
        def do_stop_search(self):
            pass
    
        @pyqtSlot(dict)
        def do_append_result(self, item):
            pass
        
        def on_btn_search_clicked(self):
            self.search = SearchThread(self, text)
            self.search.run()
    
    
    class SearchThread(QThread):
        to_append_result = pyqtSignal([dict])
        to_stop_search = pyqtSignal()
    
        def __init__(self, obj, key_word):
            super().__init__()
            self.site = obj.site         # obj.site is a class
            self.key = key_word
            self.to_append_result.connect(obj.do_append_result)
            self.to_stop_search.connect(obj.do_stop_search)
    
        def run(self):
            search = self.site(self.to_append_result)
            search.search(self.key)     # do a lot of things
            self.to_stop_search.emit()
    

    请问这个实现哪里出了问题?

    10 条回复    2018-04-24 13:12:27 +08:00
    dychenyi
        1
    dychenyi  
       2018-04-22 15:31:37 +08:00
    没用过 pyqt,但是在用原生 qt,qt 起线程不是 start 吗? 你怎么直接调用 run。。。
    catror
        2
    catror  
       2018-04-22 16:09:34 +08:00 via Android
    因为你在 ui 线程里调用的 run 函数,创建的新线程没用
    nicevar
        3
    nicevar  
       2018-04-22 16:28:47 +08:00
    楼主你要补一下基础知识,你这直接调用 run 怎么能行呢,跟不用线程还有啥区别,用 start 启动线程
    xwyam
        4
    xwyam  
    OP
       2018-04-22 16:51:59 +08:00
    @dychenyi 擦,手抖了。。。。多谢
    xwyam
        5
    xwyam  
    OP
       2018-04-22 16:52:12 +08:00
    @catror 手抖了。。。。多谢
    xwyam
        6
    xwyam  
    OP
       2018-04-22 16:52:20 +08:00
    @nicevar 手抖了。。。。多谢
    Hopetree
        7
    Hopetree  
       2018-04-22 20:55:54 +08:00
    strat() 正解,以前我也写过 pyqt,现在感觉真麻烦,还不如写成 web
    xwyam
        8
    xwyam  
    OP
       2018-04-24 12:37:19 +08:00
    @Hopetree web 爬虫的话,是用后台的 python 做,还是直接 javascript 爬?
    Hopetree
        9
    Hopetree  
       2018-04-24 13:10:59 +08:00
    @xwyam 当然是 python 啊,你看一下我博客的工具页面,前面的三个工具都是利用的 Python 的爬虫完成的后台,然后把结果传递到前台展现,ajax 传递数据就行了,这是小爬虫。如果是耗时间比较长的爬虫可以设置定时任务让 python 爬,然后把结果存起来,前台要调用的时候去读取结果就行了,这是我理解的方式
    Hopetree
        10
    Hopetree  
       2018-04-24 13:12:27 +08:00
    @xwyam 忘了发博客工具页面的链接了 http://www.tendcode.com/tool/,还有我以前写的 pyqt 的工具,是多线程的任务,https://github.com/Hopetree/TMTools
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1209 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:22 · PVG 02:22 · LAX 10:22 · JFK 13:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.