import random import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtChart import * class RandomGenerator(QObject): dataReady = pyqtSignal(int) stopSignal = pyqtSignal() def init(self): super().init() self.queue = [] self.count = 0 def start(self): while True: val = random.randint(1, 49) if val < 50: self.queue.append(val) print(self.queue) if len(self.queue) == 1: self.dataReady.emit(val) else: self.count += 1 if self.count >= 2: self.stopSignal.emit() break class ChartDrawer(QObject): finished = pyqtSignal() def init(self, queue): super().init() self.queue = queue self.series = QLineSeries() def start(self): while True: if len(self.queue) > 0: print("start draw") val = self.queue.pop(0) self.series.append(self.series.count(), val) else: break self.finished.emit() print('end draw') class MainWindow(QMainWindow): def init(self): super().init() self.generator = RandomGenerator() self.drawer = ChartDrawer(self.generator.queue) self.chartView = QChartView() self.chart = QChart() self.chart.addSeries(self.drawer.series) self.chart.createDefaultAxes() self.chartView.setChart(self.chart) self.startButton = QPushButton("Start") self.startButton.clicked.connect(self.start) self.stopButton = QPushButton("Stop") self.stopButton.clicked.connect(self.stop) self.stopButton.setEnabled(False) self.statusBar().showMessage("Ready") layout = QVBoxLayout() layout.addWidget(self.chartView) layout.addWidget(self.startButton) layout.addWidget(self.stopButton) widget = QWidget() widget.setLayout(layout) self.setCentralWidget(widget) def start(self): self.statusBar().showMessage("Running") self.generatorThread = QThread() self.generator.moveToThread(self.generatorThread) self.generatorThread.started.connect(self.generator.start) self.generator.dataReady.connect(self.handleDataReady) self.generator.stopSignal.connect(self.handleStopSignal) self.generatorThread.start() self.drawerThread = QThread() self.drawer.moveToThread(self.drawerThread) self.drawer.finished.connect(self.handleDrawerFinished) self.drawerThread.start() self.startButton.setEnabled(False) self.stopButton.setEnabled(True) def stop(self): self.statusBar().showMessage("Stopping") self.generator.stopSignal.emit() self.generatorThread.quit() self.drawerThread.quit() self.startButton.setEnabled(True) self.stopButton.setEnabled(False) def handleDataReady(self, val): self.drawer.series.append(self.drawer.series.count(), val) def handleStopSignal(self): self.generatorThread.quit() def handleDrawerFinished(self): self.chartView.show() self.statusBar().showMessage("Finished") self.startButton.setEnabled(True) self.stopButton.setEnabled(False) if name == 'main': app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) 检查上述代码为何在点击start按钮后只生成三个随机数后就停止生成数据,且未画图
时间: 2024-03-11 15:06:32 浏览: 142
在上述代码中,当随机数生成的值大于等于50时,没有将这个值加入到队列中。因此,队列中的随机数数量不足以绘制图表。解决方法是将第11行代码修改为`if val <= 50:`。另外,在 `RandomGenerator` 类的 `start` 方法中,当队列中只有一个随机数时,应该使用 `self.queue[0]` 而不是 `val`。这些修改后,点击 start 按钮后,会绘制出完整的图表。
相关问题
解释这段代码import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *
这段代码是用来导入 PyQT5 模块中的一些类和方法,方便我们在 Python 程序中创建 GUI 界面应用程序。其中 `sys` 模块用于与 Python 解释器交互,`QtCore` 模块包含核心非 GUI 类,`QtGui` 模块包含一些常用的 GUI 类,`QtWidgets` 模块则包含更多的组件类。通过这段代码,我们可以使用 PyQT5 的各种 UI 组件和功能。
from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import *
这段代码导入了 PyQt5 模块中的一些 GUI 元素和功能,具体如下:
- `QtWidgets`:包含了一些常见的 GUI 元素,如窗口、按钮、标签等。
- `QtCore`:包含了一些 Qt 的核心功能,如事件循环、定时器等。
- `QtGui`:包含了一些图形相关的功能,如绘图、字体、颜色等。
这些模块中的元素和功能可以帮助你创建出漂亮且功能强大的 GUI 界面。
阅读全文