Python-PyQt版面配置與嵌入即時動態圖

控制板讀到的訊號需要即時顯示,因此我用PyQT寫了個GUI範例,並且能即時更新圖表,畫圖的部分採用matplotlib。


上面圖表就是程式碼會顯示的即時圖,右邊是即時產生sin與cos值,左邊是cos、sin分別在x,y軸產生出來的圖形。
   
import sys
import PyQt5
import time
import numpy as np

from matplotlib.backends.qt_compat import QtCore, QtWidgets, is_pyqt5
if is_pyqt5():
    from matplotlib.backends.backend_qt5agg import (
        FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
else:
    from matplotlib.backends.backend_qt4agg import (
        FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
from matplotlib.figure import Figure


class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self._main = QtWidgets.QWidget()
        self.setCentralWidget(self._main)

        layout = QtWidgets.QGridLayout(self._main)
        #新增圖表
        dynamic_canvas_total = FigureCanvas(Figure(figsize=(5, 3)))
        dynamic_canvas_x = FigureCanvas(Figure(figsize=(5, 3)))
        dynamic_canvas_y = FigureCanvas(Figure(figsize=(5, 3)))

        #將圖表加入介面
        layout.addWidget(dynamic_canvas_total,1,1,2,1) #圖在第1 row 1 column為起始 共佔2 row 1 colcolumn
        self.addToolBar(NavigationToolbar(dynamic_canvas_total, self))

        layout.addWidget(dynamic_canvas_x,1,2,1,1) #圖在第1 row 2 column為起始 共佔1 row 1 colcolumn
        #self.addToolBar(NavigationToolbar(dynamic_canvas_x, self))

        layout.addWidget(dynamic_canvas_y,2,2,1,1) #圖在第2 row 2 column為起始 共佔1 row 1 colcolumn
        #self.addToolBar(QtCore.Qt.BottomToolBarArea,
        #                NavigationToolbar(dynamic_canvas_y, self))

        #繪圖

        self._dynamic_total = dynamic_canvas_total.figure.subplots()
        self._timer_total = dynamic_canvas_total.new_timer(
            100, [(self._update_canvas, (), {})])
        self._timer_total.start()

        self._dynamic_ax = dynamic_canvas_x.figure.subplots()
        self._timer_x = dynamic_canvas_x.new_timer(
            100, [(self._update_canvas, (), {})])
        self._timer_x.start()

        self._dynamic_ay = dynamic_canvas_y.figure.subplots()
        self._timer_y = dynamic_canvas_y.new_timer(
            100, [(self._update_canvas, (), {})])
        self._timer_y.start()

    def _update_canvas(self):
        self._dynamic_ax.clear()
        t = np.linspace(0, 10, 101)
        # Shift the sinusoid as a function of time.
        self._dynamic_ax.plot(t, np.cos(t + time.time()))
        self._dynamic_ax.figure.canvas.draw()

        self._dynamic_ay.clear()
        t = np.linspace(0, 10, 101)
        # Shift the sinusoid as a function of time.
        self._dynamic_ay.plot(t, np.sin(t + time.time()))
        self._dynamic_ay.figure.canvas.draw()

        self._dynamic_total.scatter(np.cos(t + time.time()), np.sin(t + time.time()))
        self._dynamic_total.figure.canvas.draw()


if __name__ == "__main__":
    qapp = QtWidgets.QApplication(sys.argv)
    app = ApplicationWindow()
    app.resize(1024, 768)
    app.setWindowTitle("振動監測")
    app.show()
    qapp.exec_()
可以先看主程式的部份,就是呼叫我們定義的class並且調整一下初始大小與title,最後呈現。 而class的部分,我們使用網格layout(QGridLayout),並新增三個圖表,依序把圖加到適當位置(程式碼註解有介紹),再來用timer定期去更新我們的圖表。

留言

這個網誌中的熱門文章

Python-相關係數矩陣實作(python-correlation matrix )

ASP.NET-後端將值傳給javascript

ASP.NET-FileUpload上傳後自動觸發button click(FileUpload upload auto trigger button click)