Python 如何在PyQt中与libtorrent一起使用QThreads?

Python 如何在PyQt中与libtorrent一起使用QThreads?,python,qt,pyqt,qthread,libtorrent,Python,Qt,Pyqt,Qthread,Libtorrent,我想编写一些简单的PyQt torrent客户端,但我遇到了一些问题。 我想运行一些循环,在PyQt代码中下载文件(使用libtorrent的简单代码)。 虽然,当torrent下载工作时,UI不会显示,当我更改调用函数的顺序时,UI会显示,但下载不工作。 我读过关于QThread的书,但这对我来说有点难——有人能解释一下QThread是如何工作的,以及如何与libtorrent一起使用它吗? 下面是torrent客户端代码的一些示例: import libtorrent as lt impor

我想编写一些简单的PyQt torrent客户端,但我遇到了一些问题。 我想运行一些循环,在PyQt代码中下载文件(使用libtorrent的简单代码)。 虽然,当torrent下载工作时,UI不会显示,当我更改调用函数的顺序时,UI会显示,但下载不工作。 我读过关于QThread的书,但这对我来说有点难——有人能解释一下QThread是如何工作的,以及如何与libtorrent一起使用它吗? 下面是torrent客户端代码的一些示例:

import libtorrent as lt
import time
import sys

ses = lt.session()
ses.listen_on(6881, 6891)

info = lt.torrent_info(sys.argv[1])
h = ses.add_torrent({'ti': info, 'save_path': './'})
print 'starting', h.name()

while (not h.is_seed()):
   s = h.status()

   state_str = ['queued', 'checking', 'downloading metadata', \
      'downloading', 'finished', 'seeding', 'allocating', 'checking fastresume']
   print '\r%.2f%% complete (down: %.1f kb/s up: %.1f kB/s peers: %d) %s' % \
      (s.progress * 100, s.download_rate / 1000, s.upload_rate / 1000, \
      s.num_peers, state_str[s.state]),
   sys.stdout.flush()

   time.sleep(1)

print h.name(), 'complete'

我想象QT运行一个消息循环,直到应用程序终止才返回


我相信您想要做的是将循环体(轮询libtorrent状态)移动到一个由QT定期调用的消息处理程序中。比如说,一个定时器功能。

首先,我建议使用Qt的PySide实现

在这种情况下(以及普通pyQt),您应该查看信号和插槽:

基本上,您只需要设置一个通常称为“Worker”的类,它只是一个QThread

class Worker(QtCore.QThread):
    updateProgress = QtCore.Signal(int) #or whatever you wanna call it 
这是上面代码的地方。 然后,您要做的是连接主GUI线程/类中的信号

self.worker.updateProgress.connect(self.setProgress) #notice no ()


def setProgress(self, progress):
    self.progressBar.setValue(progress) 
最后,在将输出所需值的函数内部:

self.updateProgress.emit(value)
这个例子暗示了一些类似于进度条的功能。我知道这篇文章很老,但这本可以帮助我,所以希望谷歌的人会发现它很有用;)