我想写一些简单的PyQt torrent客户端,但我对此有所了解。 我想运行一些循环,它负责在PyQt代码中下载文件(使用libtorrent的简单代码)。 虽然,当torrent下载工作时,UI不会显示,当我更改被调用函数的顺序时,UI显示但下载不起作用。 我读过关于QThreads的内容,但对我来说有点困难 - 有人能解释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'
答案 0 :(得分:1)
我认为QT会运行一个消息循环,直到应用程序终止才会返回。
我认为你想要做的是将循环体(轮询libtorrent状态)移动到QT定期调用的消息处理程序中。比如,一个计时器功能。
答案 1 :(得分:1)
首先,我建议使用Qt的PySide实现。
在那种情况下(和普通的pyQt)你应该研究信号和插槽:
http://qt-project.org/wiki/Signals_and_Slots_in_PySide
http://zetcode.com/gui/pyqt4/eventsandsignals/
基本上你只需要设置一个通常被称为“工人”的工作人员。只是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)
此示例意味着类似进度条功能。我知道这篇文章很老 - 但这对我有所帮助,所以希望googlers会发现它很有用;)