如何自动刷新PyQt5表小部件

时间:2019-08-17 15:35:04

标签: python-3.x qtablewidget

我正在尝试构建实时流下载器。它创建了多个线程以同时下载流。我希望每次启动线程并在下载程序中使用新名称时刷新表。这将创建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窗口移开,然后重新放回它,以便刷新表。我希望它会自动刷新。

0 个答案:

没有答案