python - PyQt4 Matplotlib 疑难解答
问题描述
所以我设法编写了一个 PyQt4 Widget,它可以在一个线程中运行一个循环。2 事情在线程中完成。
开始一个循环,并向进度条发出信号以提供有关进度的信息。(我知道这可以做得更好,但对于我的任务来说已经足够了)
循环运行完成后,从线程内部向 matplotlib 发出 pandas.DataFrame,matplotlib 位于线程外部,位于主 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_())
解决方案
推荐阅读
- javascript - 每个父子对在 D3 Hierarchy Typescript 中具有相同的颜色
- regex - 根页面路径的正则表达式
- visual-studio-code - ESLint:eslintrc 中的意外属性“缩进”
- swiftui - 带有 SwiftUI 的 HEREMaps 在实例化时崩溃并显示 EXC_BAD_INSTRUCTION
- javascript - 从 iframe 标签获取嵌入的 youtube 播放列表视频的当前时间戳
- google-colaboratory - .vision 和 .utils、download_url、VisionDataset 的 ModuleNotFoundError
- amazon-web-services - 使用 pem 密钥 SSH 到 AWS 实例要求输入密码
- c++ - QTcpSocket(或 QSslSocket)是否作为 QWebSocket 的基础——在发生套接字错误时自行销毁?
- java - 字符串类不能转换为节点类
- configuration - 如何使用 JMeter 测试 10 个线程?