我正在尝试构建实时流下载器。它创建了多个线程以同时下载流。我希望每次启动线程并在下载程序中使用新名称时刷新表。这将创建GUI并启动主下载程序线程(在setupUi末尾启动下载程序):
class Ui_MainWindow(object):
def __init__(self,threadnum):
self.threadnum=threadnum
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(851, 560)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
MainWindow.setTabShape(QtWidgets.QTabWidget.Rounded)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.menutablo = QtWidgets.QFrame(self.centralwidget)
self.menutablo.setGeometry(QtCore.QRect(0, 0, 225, 540))
self.menutablo.setMinimumSize(QtCore.QSize(225, 0))
self.menutablo.setMaximumSize(QtCore.QSize(225, 16777215))
self.menutablo.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.menutablo.setFrameShadow(QtWidgets.QFrame.Sunken)
self.menutablo.setLineWidth(7)
self.menutablo.setObjectName("menutablo")
self.menuindirmeyoneticisi = QtWidgets.QPushButton(self.menutablo)
self.menuindirmeyoneticisi.setGeometry(QtCore.QRect(0, 120, 225, 60))
self.menuindirmeyoneticisi.setObjectName("menuindirmeyoneticisi")
self.menuyayincilar = QtWidgets.QPushButton(self.menutablo)
self.menuyayincilar.setGeometry(QtCore.QRect(0, 240, 225, 60))
self.menuyayincilar.setObjectName("menuyayincilar")
self.menuayarlar = QtWidgets.QPushButton(self.menutablo)
self.menuayarlar.setGeometry(QtCore.QRect(0, 360, 225, 60))
self.menuayarlar.setObjectName("menuayarlar")
self.downloaderseceneklerframe = QtWidgets.QFrame(self.centralwidget)
self.downloaderseceneklerframe.setGeometry(QtCore.QRect(225, 0, 625, 70))
self.downloaderseceneklerframe.setMinimumSize(QtCore.QSize(625, 70))
self.downloaderseceneklerframe.setMaximumSize(QtCore.QSize(116551, 70))
self.downloaderseceneklerframe.setAutoFillBackground(False)
self.downloaderseceneklerframe.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.downloaderseceneklerframe.setFrameShadow(QtWidgets.QFrame.Sunken)
self.downloaderseceneklerframe.setObjectName("downloaderseceneklerframe")
self.downloaderbaslat = QtWidgets.QPushButton(self.downloaderseceneklerframe)
self.downloaderbaslat.setGeometry(QtCore.QRect(19, 10, 50, 50))
self.downloaderbaslat.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
self.downloaderbaslat.setAutoFillBackground(False)
self.downloaderbaslat.setText("")
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("icon\\Webp.net-resizeimage (1).png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.downloaderbaslat.setIcon(icon)
self.downloaderbaslat.setIconSize(QtCore.QSize(50, 50))
self.downloaderbaslat.setAutoDefault(False)
self.downloaderbaslat.setDefault(False)
self.downloaderbaslat.setFlat(False)
self.downloaderbaslat.setObjectName("downloaderbaslat")
self.downloadesiradaki = QtWidgets.QPushButton(self.downloaderseceneklerframe)
self.downloadesiradaki.setGeometry(QtCore.QRect(88, 10, 50, 50))
self.downloadesiradaki.setText("")
icon1 = QtGui.QIcon()
icon1.addPixmap(QtGui.QPixmap("icon\\Webp.net-resizeimage (2).png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.downloadesiradaki.setIcon(icon1)
self.downloadesiradaki.setIconSize(QtCore.QSize(50, 50))
self.downloadesiradaki.setObjectName("downloadesiradaki")
self.downloaderdurdur = QtWidgets.QPushButton(self.downloaderseceneklerframe)
self.downloaderdurdur.setGeometry(QtCore.QRect(157, 10, 50, 50))
self.downloaderdurdur.setText("")
icon2 = QtGui.QIcon()
icon2.addPixmap(QtGui.QPixmap("icon\\Webp.net-resizeimage (3).png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.downloaderdurdur.setIcon(icon2)
self.downloaderdurdur.setIconSize(QtCore.QSize(50, 50))
self.downloaderdurdur.setObjectName("downloaderdurdur")
self.downloaderstartall = QtWidgets.QPushButton(self.downloaderseceneklerframe)
self.downloaderstartall.setGeometry(QtCore.QRect(226, 10, 50, 50))
self.downloaderstartall.setText("")
icon3 = QtGui.QIcon()
icon3.addPixmap(QtGui.QPixmap("icon\\Webp.net-resizeimage (4).png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.downloaderstartall.setIcon(icon3)
self.downloaderstartall.setIconSize(QtCore.QSize(50, 50))
self.downloaderstartall.setObjectName("downloaderstartall")
self.downloaderstopall = QtWidgets.QPushButton(self.downloaderseceneklerframe)
self.downloaderstopall.setGeometry(QtCore.QRect(295, 10, 50, 50))
self.downloaderstopall.setText("")
icon4 = QtGui.QIcon()
icon4.addPixmap(QtGui.QPixmap("icon\\Webp.net-resizeimage (6).png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.downloaderstopall.setIcon(icon4)
self.downloaderstopall.setIconSize(QtCore.QSize(50, 50))
self.downloaderstopall.setObjectName("downloaderstopall")
self.downloaderayarlar = QtWidgets.QPushButton(self.downloaderseceneklerframe)
self.downloaderayarlar.setGeometry(QtCore.QRect(364, 10, 50, 50))
self.downloaderayarlar.setText("")
icon5 = QtGui.QIcon()
icon5.addPixmap(QtGui.QPixmap("icon\\Webp.net-resizeimage (8).png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.downloaderayarlar.setIcon(icon5)
self.downloaderayarlar.setIconSize(QtCore.QSize(50, 50))
self.downloaderayarlar.setObjectName("downloaderayarlar")
self.downloaderlog = QtWidgets.QPushButton(self.downloaderseceneklerframe)
self.downloaderlog.setGeometry(QtCore.QRect(433, 10, 50, 50))
self.downloaderlog.setText("")
icon6 = QtGui.QIcon()
icon6.addPixmap(QtGui.QPixmap("icon\\Webp.net-resizeimage (7).png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.downloaderlog.setIcon(icon6)
self.downloaderlog.setIconSize(QtCore.QSize(50, 50))
self.downloaderlog.setObjectName("downloaderlog")
self.downloaderkapat = QtWidgets.QPushButton(self.downloaderseceneklerframe)
self.downloaderkapat.setGeometry(QtCore.QRect(502, 10, 50, 50))
self.downloaderkapat.setText("")
icon7 = QtGui.QIcon()
icon7.addPixmap(QtGui.QPixmap("icon\\Webp.net-resizeimage (9).png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.downloaderkapat.setIcon(icon7)
self.downloaderkapat.setIconSize(QtCore.QSize(50, 50))
self.downloaderkapat.setObjectName("downloaderkapat")
self.frame_3 = QtWidgets.QFrame(self.centralwidget)
self.frame_3.setGeometry(QtCore.QRect(225, 70, 625, 470))
self.frame_3.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame_3.setFrameShadow(QtWidgets.QFrame.Sunken)
self.frame_3.setObjectName("frame_3")
self.downloadertable = QtWidgets.QTableWidget(self.frame_3)
self.downloadertable.setGeometry(QtCore.QRect(0, 0, 625, 470))
self.downloadertable.setMaximumSize(QtCore.QSize(625, 470))
self.downloadertable.setEditTriggers(QtWidgets.QAbstractItemView.SelectedClicked)
self.downloadertable.setTabKeyNavigation(True)
self.downloadertable.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
self.downloadertable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
self.downloadertable.setTextElideMode(QtCore.Qt.ElideMiddle)
self.downloadertable.setShowGrid(True)
self.downloadertable.setGridStyle(QtCore.Qt.SolidLine)
self.downloadertable.setWordWrap(True)
self.downloadertable.setCornerButtonEnabled(True)
self.downloadertable.setObjectName("downloadertable")
self.downloadertable.setColumnCount(3)
self.downloadertable.setRowCount(self.threadnum)
for sutun in range(0,self.threadnum):
item = QtWidgets.QTableWidgetItem()
self.downloadertable.setVerticalHeaderItem(sutun, item)
item = QtWidgets.QTableWidgetItem()
item.setText("Durum")
self.downloadertable.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.downloadertable.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.downloadertable.setHorizontalHeaderItem(2, item)
self.downloadertable.horizontalHeader().setVisible(True)
self.downloadertable.horizontalHeader().setCascadingSectionResizes(False)
self.downloadertable.horizontalHeader().setDefaultSectionSize(200)
self.downloadertable.horizontalHeader().setHighlightSections(False)
self.downloadertable.horizontalHeader().setSortIndicatorShown(False)
self.downloadertable.horizontalHeader().setStretchLastSection(True)
self.downloadertable.verticalHeader().setDefaultSectionSize(35)
self.downloadertable.verticalHeader().setHighlightSections(False)
self.downloadertable.verticalHeader().setSortIndicatorShown(False)
for satir in range(0,self.threadnum):
self.downloadertable.setItem(satir,0,QtWidgets.QTableWidgetItem(""))
self.downloadertable.setItem(satir,1,QtWidgets.QTableWidgetItem(""))
self.downloadertable.setItem(satir,2,QtWidgets.QTableWidgetItem(""))
self.scrollArea = QtWidgets.QScrollArea(self.frame_3)
self.scrollArea.setGeometry(QtCore.QRect(0, 0, 625, 470))
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 623, 468))
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.scrollArea.raise_()
self.downloadertable.raise_()
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.MainWindow=MainWindow
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
mainthread=ThreadKontrol(self.threadnum,self.downloadertable)
t1=threading.Thread(target=mainthread.threadleriolustur)
t1.start()
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Downloader"))
self.menuindirmeyoneticisi.setText(_translate("MainWindow", "İndirme Yöneticisi"))
self.menuyayincilar.setText(_translate("MainWindow", "Yayıncılar"))
self.menuayarlar.setText(_translate("MainWindow", "Ayarlar"))
self.downloadertable.setSortingEnabled(False)
for satir in range(0,self.threadnum):
item = self.downloadertable.verticalHeaderItem(satir)
item.setText(_translate("MainWindow", str(satir+1)))
item = self.downloadertable.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "İsim"))
item = self.downloadertable.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "Süre"))
原始类太长,因此这是下载器类的相关部分。它为每个下载器创建一个线程。每个人都会收到一个名称,以尝试从自身列表中下载:
class ThreadKontrol():
def threadleriolustur(self):
listthread=threading.Thread(target=self.listolustur) #gets a name list from function
listthread.start()
time.sleep(2)
for thread in range(1,self.threadnum+1):
ConfigIslem.threadconfigolustur(thread) #creates a config file for each thread
self.createhread(thread) # starts every thread
while True:
time.sleep(10) # keeps program from ending
def createthread(self,thread):
t=threading.Thread(target=self.runthread,args=(thread,))
t.start()
time.sleep(2)
def changestat(self,row,column,text): #changes the relevant table box to text
item = self.downloadertable.item(row,column)
item.setText(text)
def runthread(self,thread):
while True:
self.changestat(thread-1,0,"Running")
name=self.getname() # gets a name from function to try if it's available for download
self.changestat(thread-1,1,name) # prints the name to relevant box in table
indir=indirme(name,thread) # this is the downloader object
value=indir.startDownload()
del indir #deletes the downloader object once complete
time.sleep(3)
self.sendnameback(name) #sends the name back to list to try another time
所以它可以工作,但是我必须将焦点从GUI窗口移开,然后重新放回它,以便刷新表。我希望它会自动刷新。