【问题标题】:Simple torrent client with PyQt使用 PyQt 的简单 torrent 客户端
【发布时间】:2013-05-02 11:07:31
【问题描述】:

最近我开始了我的 Python 练习。这是非常有用的 PL,尤其是当您使用 Linux 时。 所以这是我的问题:我真的很喜欢 Qt 的简单性和 Python 的强大功能,但它让我有点过分了。 我想使用 PyQt 和 libtorrent 构建一个非常简单的 torrent 客户端。 当时我什至已经准备好使用该代码来下载一个种子。 虽然,我在将应用程序代码与 Qt 的代码集成时遇到了麻烦。 这是 torrent.py 的代码: #!/usr/bin/python 导入系统 从 PyQt4 导入 QtCore、QtGui 将 libtorrent 导入为 lt 进口时间

from torrent_ui import Ui_Form, ses


class MyForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = MyForm()
    myapp.show()


    ses.listen_on(6881, 6891)
    #e = lt.bdecode(open("test.torrent", 'rb').read())
    info = lt.torrent_info("g.torrent")
    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()
       #ses.pause()

       time.sleep(1)

    print h.name(), 'complete'
    sys.exit(app.exec_())

从 PyQt 生成的代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled.ui'
#
# Created: Mon Apr 29 21:13:06 2013
#      by: PyQt4 UI code generator 4.10
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui
import sys
import libtorrent as lt
ses = lt.session()
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(640, 480)
        self.closeb = QtGui.QPushButton(Form)
        self.closeb.setGeometry(QtCore.QRect(520, 440, 98, 27))
        self.closeb.setObjectName(_fromUtf8("closeb"))
        self.listView = QtGui.QListView(Form)
        self.listView.setGeometry(QtCore.QRect(30, 20, 581, 261))
        self.listView.setObjectName(_fromUtf8("listView"))
        self.newtorb = QtGui.QPushButton(Form)
        self.newtorb.setGeometry(QtCore.QRect(30, 300, 98, 27))
        self.newtorb.setObjectName(_fromUtf8("newtorb"))
        self.stopb = QtGui.QPushButton(Form)
        self.stopb.setGeometry(QtCore.QRect(130, 300, 98, 27))
        self.stopb.setObjectName(_fromUtf8("stopb"))
        self.pauseb = QtGui.QPushButton(Form)
        self.pauseb.setGeometry(QtCore.QRect(230, 300, 98, 27))
        self.pauseb.setObjectName(_fromUtf8("pauseb"))
        self.selectallb = QtGui.QPushButton(Form)
        self.selectallb.setGeometry(QtCore.QRect(330, 300, 141, 27))
        self.selectallb.setObjectName(_fromUtf8("selectallb"))
        #self.ses = lt.session()
        self.retranslateUi(Form)
        QtCore.QObject.connect(self.closeb, QtCore.SIGNAL(_fromUtf8("clicked()")), Form.close)
        QtCore.QObject.connect(self.pauseb, QtCore.SIGNAL(_fromUtf8("clicked()")), self.pausef)
        QtCore.QObject.connect(self.stopb, QtCore.SIGNAL(_fromUtf8("clicked()")), self.stopb.click)
        QtCore.QObject.connect(self.newtorb, QtCore.SIGNAL(_fromUtf8("clicked()")), self.newtorb.click)
        QtCore.QObject.connect(self.selectallb, QtCore.SIGNAL(_fromUtf8("clicked()")), self.listView.selectAll)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(_translate("Form", "JKTorrent", None))
        self.closeb.setText(_translate("Form", "close", None))
        self.newtorb.setText(_translate("Form", "Dodaj newtor", None))
        self.stopb.setText(_translate("Form", "stop", None))
        self.pauseb.setText(_translate("Form", "pause", None))
        self.selectallb.setText(_translate("Form", "Zaznacz wszystkie", None))
    def pausef(self):
        self.ses.pause()

主要问题是,当洪流下载工作时,Qt 应用程序窗口不显示。另一个问题是我不知道如何将 libtorrent 代码放入那个精美的 Qt 窗口(将所有数据打印到列表视图中)。 请帮帮我。

【问题讨论】:

    标签: python pyqt libtorrent


    【解决方案1】:

    您的问题是app.exec_() 之前有一些代码。窗口显示何时执行。部分

    ses.listen_on(6881, 6891)
    #e = lt.bdecode(open("test.torrent", 'rb').read())
    info = lt.torrent_info("g.torrent")
    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()
       #ses.pause()
    
       time.sleep(1)
    

    应该从主函数中删除,并且应该运行,可能在一个单独的线程中,在一个在MyForm__init__ 中启动的函数中。

    有点不清楚 QListView 的问题是什么。我建议您改用 QTreeWidget,我发现 documentation 很有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多