PyQt4 Matplotlib故障排除

时间:2018-05-10 10:41:27

标签: python multithreading pandas matplotlib pyqt4

所以我设法写了一个PyQt4 Widget,它可以在一个线程中运行一个循环。 2事情在线程中完成。

  1. 启动循环并向进度条发出信号以提供有关进度的信息。 (我知道这可以做得更好,但我的任务就足够了)

  2. 循环完成后,pandas.DataFrame从线程内部发送到matplotlib,它位于线程外部和主Widget类中。

  3. 一切正常,您可以在处理循环时移动Widget。唯一的问题是,当弹出绘图(或处理完成)的同时移动Widget时,一切都会冻结。不仅是Widget和情节,还有我的Windows桌面。我可以通过任务管理器摆脱它。任何建议如何规避这个?

    我正在使用Python 3.6(32位)

    代码:

    import sys
    from PyQt4.QtGui import *
    from PyQt4.QtCore import *
    import matplotlib.pyplot as plt
    import pandas as pd
    
    class App(QMainWindow):
    
        def __init__(self):
            super(App, self).__init__()
            self.setGeometry(500, 300, 820, 350)
            self.setWindowTitle("Program")
            self.initUI()
    
        def initUI(self):
    
            #Buttons
            btnposx = 30
            btnposy = 50
    
            self.btn4 = QPushButton('Load', self)
            self.btn4.move(btnposx,btnposy+220)       
            self.btn4.released.connect(self.thread)
    
            #ProgressBar
            self.pb = QProgressBar(self)
            self.pb.move(btnposx+150,btnposy+220)
            self.pb.resize(470,27)        
    
            self.show()
    
        @pyqtSlot(float)
        def load(self, val):
            self.pb.setValue(val)
    
        @pyqtSlot(object)
        def plot(self, pq):
            pq.plot(grid = 1)
            plt.show()
    
        def thread(self):
            self.thread_ = Thread()
            self.thread_.pb_signal.connect(self.load, Qt.QueuedConnection)
            self.thread_.plot_signal.connect(self.plot, Qt.QueuedConnection)
            self.thread_.start()
    
    class Thread(QThread):
        pb_signal = pyqtSignal(float)
        plot_signal = pyqtSignal(object)
    
        def __init__(self, *args, **kwargs):
            QThread.__init__(self, *args, **kwargs)
    
        def __del__(self):
            self.wait()
    
        @pyqtSlot()    
        def run(self):       
            val = 0
            self.pb_signal.emit(20)
            l = range(50000000)
            for i in l:
                val += 1
            self.pb_signal.emit(60)
            self.pb_signal.emit(100)
            pq = pd.DataFrame(data = {'col1':[1,2,3,4,5,6], 'col2':[6,5,4,3,2,1]})
            self.plot_signal.emit(pq)        
            return
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = App()
        ex.show()
        sys.exit(app.exec_())
    

0 个答案:

没有答案