2017-10-25 2 views
0

Ich habe einen einfachen Dialog mit drei Fortschrittsbalken, die ich ständig aktualisieren möchte (Anzeige der Systemressourcennutzung). Aus dem Lesen der Dokumente ist QTimer der richtige Weg, um eine Funktion alle x Millisekunden (die die Fortschrittsbalken aktualisieren würde) zu feuern. Ich kann es jedoch nicht zur Arbeit bringen und weiß nicht genau warum. Es scheint relativ einfach zu sein, das Timer-Timeout-Signal mit einer Update-Funktion zu verbinden, aber es scheint nie zu brennen.PyQt4: benutze einen QTimer, um die Fortschrittsbalken fortlaufend zu aktualisieren

Hier ist mein Code:

import sys 
from PyQt4 import QtGui, QtCore 
import psutil 

class Tiny_System_Monitor(QtGui.QWidget): 
    def __init__(self): 
     super(Tiny_System_Monitor, self).__init__() 
     self.initUI() 

    def initUI(self): 
     mainLayout = QtGui.QHBoxLayout() 

     self.cpu_progressBar = QtGui.QProgressBar() 
     self.cpu_progressBar.setTextVisible(False) 
     self.cpu_progressBar.setOrientation(QtCore.Qt.Vertical) 
     mainLayout.addWidget(self.cpu_progressBar) 

     self.vm_progressBar = QtGui.QProgressBar() 
     self.vm_progressBar.setOrientation(QtCore.Qt.Vertical) 
     mainLayout.addWidget(self.vm_progressBar) 

     self.swap_progressBar = QtGui.QProgressBar() 
     self.swap_progressBar.setOrientation(QtCore.Qt.Vertical) 
     mainLayout.addWidget(self.swap_progressBar) 

     self.setLayout(mainLayout) 

     timer = QtCore.QTimer() 
     timer.timeout.connect(self.updateMeters) 
     timer.start(1000) 

    def updateMeters(self): 
     cpuPercent = psutil.cpu_percent() 
     vmPercent = getattr(psutil.virtual_memory(), "percent") 
     swapPercent = getattr(psutil.swap_memory(), "percent") 

     self.cpu_progressBar.setValue(cpuPercent) 
     self.vm_progressBar.setValue(vmPercent) 
     self.swap_progressBar.setValue(swapPercent) 
     print "updated meters" 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = Tiny_System_Monitor() 

    ex.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

Antwort

1

Sie einen Verweis auf das Timer-Objekt halten muss, sonst wird es sofort Garbage Collection, wenn initUI Rückkehr:

class Tiny_System_Monitor(QtGui.QWidget): 
    ... 
    def initUI(self): 
     ...  
     self.timer = QtCore.QTimer() 
     self.timer.timeout.connect(self.updateMeters) 
     self.timer.start(1000) 
+0

Danke, was gerade brauchte ich ! Es ist fast immer etwas Einfaches. Entschuldigung, während ich über die Müllsammlung nachdenke ... (Mann, ich muss ein Buch über Python lesen) – Spencer

Verwandte Themen