最近我開始了我的Python練習。這是非常有用的PL,特別是當你使用Linux時。 所以這裏是我的問題:我非常喜歡Qt的簡單性和Python的強大功能,但它已經讓我變得有點過度了。 我想用PyQt和libtorrent構建一個非常簡單的torrent客戶端。 我甚至準備好了使用該代碼來下載當前的一個種子。 雖然我在將應用程序代碼與Qt代碼集成時遇到了麻煩。 這裏的torrent.py的代碼: #在/ usr/bin中/ Python的 進口SYS 從PyQt4的進口QtCore,QtGui 進口libtorrent爲LT 進口時間PyQt簡單的洪流客戶端
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()
主要的問題是,當torrent下載工作時,Qt應用程序窗口不顯示。另一個問題是我不知道如何將libtorrent代碼放入那個奇特的Qt窗口(將所有數據打印到列表視圖中)。 請幫助我。