鱼C论坛

 找回密码
 立即注册
查看: 4585|回复: 12

关于PYQT多线程用法的疑问

[复制链接]
发表于 2017-5-23 16:44:26 | 显示全部楼层 |阅读模式
10鱼币
我之前写了一个pyqt有界面的图片爬虫,链接是http://bbs.fishc.com/thread-87017-1-1.html
当时也是遇到了UI被无响应的问题,后来找了很多资料发现很多人是提到用多线程,就是另开一个工作线程去刷新界面,当时也没有接触多线程所以就没有用,正好也找到了一个可以刷新界面的方法,于是放弃了多线程
现在我想使用多线程来重做这个爬虫,看了一下PYQT的多线程方法,有了初步的了解,也试了一下,能行得通
但是,我的第1个问题是,在工作线程中需要使用我这个爬虫里面的网址,这个网址是从主界面读取的,那我要怎么把这个读取的信息传递到工作线程中呢?
第2个问题是,可以用工作线程传递一个信号出来,然后主线程就可以利用这个信号,比如,我传递出来的是下载图片的链接,然后我可以在主界面中的Textedit中打印出来,这个我可以办到的,但是我现在不仅仅是要在这个长文本中显示信息,还需要在某些判断中把信息显示在状态栏中(可以参考我之前没用多线程的显示),所以问题是,我怎么可以传递出不同的信息?难道是定义2个信号?链接不同 的函数,还是怎么的?
l

论坛学习PYQT的就没人了么?难道你们用Python写的代码就不想做出好看一点的界面然后给别人使用么?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-23 17:32:55 | 显示全部楼层
QThread 创建类应该很好交换变量吧。

  1. Class Thread(QThread):
  2.     def __init__(self, parent=None):
  3.       ....
  4.       self.parent = parent
复制代码


写个parent当参数,创建时就能索引到创建他的类了。
父类或其他类想要获取他的内容,可以写个变量,直接获取呗。

  1. Class Thread(QThread):
  2.     def __init__(self, parent=None):
  3.       ....
  4.       self.parent = parent
  5.       self.result = 0
  6.    
  7.     def run(self):
  8.       self.result = target(*args)
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-5-23 17:50:57 | 显示全部楼层
wei_Y 发表于 2017-5-23 17:32
QThread 创建类应该很好交换变量吧。

def __init__(self, parent=None):
这里的parent是什么?
比如我要传入的参数应该是从住界面的TextEdit读取的字符串,那我是先用主界面把这个字符串读取,然后当做参数传入到工作线程的__init__()里面吗
这是我认为的方式,你说的这个”索引创建他的类”这个意思我没懂,工作线程的类不是继承的QThread么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-23 18:02:20 | 显示全部楼层
gopythoner 发表于 2017-5-23 17:50
def __init__(self, parent=None):
这里的parent是什么?
比如我要传入的参数应该是从住界面的TextEdit ...

我不知道你是怎么用的线程,我一般是
  1. class Main():
  2.                ......
  3.                self.worker = Thread(self)
  4.            
  5.            class Thread(QThread):
  6.                .....
  7.                self.parent = parent
复制代码

创建时带入 self, 创建好的Thread实例里parent就指向了Main的实例。这样相互之间就有了连接的桥梁。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-5-24 16:39:42 | 显示全部楼层
wei_Y 发表于 2017-5-23 18:02
我不知道你是怎么用的线程,我一般是

创建时带入 self, 创建好的Thread实例里parent就指向了Main的实 ...

我百度关键词“”pyQT多线程“”,找到的帖子都是类似于这种用法的http://blog.csdn.net/mr_zing/article/details/46945011
反正就是需要先定义一个信号,然后在工作到一定的时候把需要传递的信息使用信号传递出去,然后在主界面中接受这个信号进行处理
当然,这些例子都是单一的信号,而且处理也很单一,并不符合我的要求,可能需要我改变一下吧
你的方式为什么跟网上的例子一点不一样?没有信号怎么传递给主线程?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-25 12:19:24 | 显示全部楼层
gopythoner 发表于 2017-5-24 16:39
我百度关键词“”pyQT多线程“”,找到的帖子都是类似于这种用法的http://blog.csdn.net/mr_zing/article ...

如果是提醒主线程的话,信号是比较好的做法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-25 16:58:48 | 显示全部楼层
有的时候我也不知道怎么跟你说原理。好像界面更新的话用qt信号和槽试试。 QT的线程崩溃没响应。你把线程改成Threading 试试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-25 16:59:21 | 显示全部楼层
我是遇到很多次这样的坑了。原理我也没弄明白,但是换换能用就行了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-25 17:01:56 | 显示全部楼层
gopythoner 发表于 2017-5-24 16:39
我百度关键词“”pyQT多线程“”,找到的帖子都是类似于这种用法的http://blog.csdn.net/mr_zing/article ...

没信号, 你继承啊。然后发送Single就行了。
class wxsynccheck(QThread):继承QThread类

    _signal = pyqtSignal(str)       #信号

      self._signal.emit(str(self.addFriendCount)) #发送信号。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-5-26 23:19:40 | 显示全部楼层
鬼人 发表于 2017-5-25 17:01
没信号, 你继承啊。然后发送Single就行了。
class wxsynccheck(QThread):继承QThread类

经过2天的摸索,我已经基本搞清楚了QThread的基本用法,信号也传递没问题,多线程妥妥的搞起了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-5-26 23:27:53 | 显示全部楼层
wei_Y 发表于 2017-5-25 12:19
如果是提醒主线程的话,信号是比较好的做法。


我感觉我已经把QT的线程的用法搞清楚了一些了,信号发送和接受妥妥的,一个程序实现了3个工作线程可以同时工作,互不影响,界面刷新妥妥的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-22 12:27:04 | 显示全部楼层
楼主能将方法分享一下吗?我也在为这个问题发愁呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-1-23 16:10:30 | 显示全部楼层
孤独雪 发表于 2018-1-22 12:27
楼主能将方法分享一下吗?我也在为这个问题发愁呢

我已经好久没用过PYQT了,你可以自己去看看我写的源代码https://github.com/Hopetree/TMTools
这个工具是使用了三个线程的,互不影响,我感觉我那个时候已经把线程的基本用法掌握了,很好用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 02:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表