|
1 | 1 | """
|
2 | 2 | ===============
|
3 |
| -Embedding In Qt |
| 3 | +Embedding in Qt |
4 | 4 | ===============
|
5 | 5 |
|
6 | 6 | Simple Qt application embedding Matplotlib canvases. This program will work
|
|
9 | 9 | "Qt5Agg", or by first importing the desired version of PyQt.
|
10 | 10 | """
|
11 | 11 |
|
12 |
| -from __future__ import unicode_literals |
13 |
| - |
14 |
| -import os |
15 | 12 | import sys
|
| 13 | +import time |
16 | 14 |
|
17 | 15 | import numpy as np
|
18 | 16 |
|
|
26 | 24 | from matplotlib.figure import Figure
|
27 | 25 |
|
28 | 26 |
|
29 |
| -progname = os.path.basename(sys.argv[0]) |
30 |
| - |
31 |
| - |
32 |
| -class MyMplCanvas(FigureCanvas): |
33 |
| - """Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.).""" |
34 |
| - |
35 |
| - def __init__(self, parent=None, width=5, height=4, dpi=100): |
36 |
| - fig = Figure(figsize=(width, height), dpi=dpi) |
37 |
| - FigureCanvas.__init__(self, fig) |
38 |
| - |
39 |
| - self.axes = fig.subplots() |
40 |
| - self.compute_initial_figure() |
41 |
| - |
42 |
| - self.setParent(parent) |
43 |
| - self.setSizePolicy(QtWidgets.QSizePolicy.Expanding, |
44 |
| - QtWidgets.QSizePolicy.Expanding) |
45 |
| - self.updateGeometry() |
46 |
| - |
47 |
| - def compute_initial_figure(self): |
48 |
| - pass |
49 |
| - |
50 |
| - |
51 |
| -class MyStaticMplCanvas(MyMplCanvas): |
52 |
| - """Simple canvas with a sine plot.""" |
53 |
| - |
54 |
| - def compute_initial_figure(self): |
55 |
| - t = np.arange(0.0, 3.0, 0.01) |
56 |
| - s = np.sin(2 * np.pi * t) |
57 |
| - self.axes.plot(t, s) |
58 |
| - |
59 |
| - |
60 |
| -class MyDynamicMplCanvas(MyMplCanvas): |
61 |
| - """A canvas that updates itself every second with a new plot.""" |
62 |
| - |
63 |
| - def __init__(self, *args, **kwargs): |
64 |
| - MyMplCanvas.__init__(self, *args, **kwargs) |
65 |
| - timer = QtCore.QTimer(self) |
66 |
| - timer.timeout.connect(self.update_figure) |
67 |
| - timer.start(1000) |
68 |
| - |
69 |
| - def compute_initial_figure(self): |
70 |
| - self.axes.plot([0, 1, 2, 3], [1, 2, 0, 4], 'r') |
71 |
| - |
72 |
| - def update_figure(self): |
73 |
| - self.axes.cla() |
74 |
| - # Plot 4 random integers between 0 and 9. |
75 |
| - self.axes.plot(range(4), np.random.randint(0, 10, 4), 'r') |
76 |
| - self.draw() |
77 |
| - |
78 |
| - |
79 | 27 | class ApplicationWindow(QtWidgets.QMainWindow):
|
80 | 28 | def __init__(self):
|
81 |
| - QtWidgets.QMainWindow.__init__(self) |
82 |
| - self.setAttribute(QtCore.Qt.WA_DeleteOnClose) |
83 |
| - self.setWindowTitle("application main window") |
84 |
| - |
85 |
| - self.file_menu = QtWidgets.QMenu('&File', self) |
86 |
| - self.file_menu.addAction('&Quit', self.fileQuit, |
87 |
| - QtCore.Qt.CTRL + QtCore.Qt.Key_Q) |
88 |
| - self.menuBar().addMenu(self.file_menu) |
89 |
| - |
90 |
| - self.help_menu = QtWidgets.QMenu('&Help', self) |
91 |
| - self.menuBar().addSeparator() |
92 |
| - self.menuBar().addMenu(self.help_menu) |
93 |
| - |
94 |
| - self.help_menu.addAction('&About', self.about) |
95 |
| - |
96 |
| - self.main_widget = QtWidgets.QWidget(self) |
97 |
| - |
98 |
| - l = QtWidgets.QVBoxLayout(self.main_widget) |
99 |
| - sc = MyStaticMplCanvas(self.main_widget, width=5, height=4, dpi=100) |
100 |
| - dc = MyDynamicMplCanvas(self.main_widget, width=5, height=4, dpi=100) |
101 |
| - l.addWidget(sc) |
102 |
| - l.addWidget(dc) |
103 |
| - |
104 |
| - self.setCentralWidget(self.main_widget) |
105 |
| - |
106 |
| - # Add a toolbar for each canvas. |
107 |
| - self.addToolBar(NavigationToolbar(sc, self)) |
108 |
| - self.addToolBar( |
109 |
| - QtCore.Qt.BottomToolBarArea, NavigationToolbar(dc, self)) |
110 |
| - |
111 |
| - def fileQuit(self): |
112 |
| - self.close() |
113 |
| - |
114 |
| - def closeEvent(self, ce): |
115 |
| - self.fileQuit() |
116 |
| - |
117 |
| - def about(self): |
118 |
| - QtWidgets.QMessageBox.about(self, "About", """\ |
119 |
| -embedding_in_qt_sgskip.py example |
120 |
| -
|
121 |
| -This program is a simple example of a Qt application embedding Matplotlib \ |
122 |
| -canvases.""") |
123 |
| - |
124 |
| - |
125 |
| -qApp = QtWidgets.QApplication(sys.argv) |
126 |
| - |
127 |
| -aw = ApplicationWindow() |
128 |
| -aw.setWindowTitle(progname) |
129 |
| -aw.show() |
130 |
| -sys.exit(qApp.exec_()) |
| 29 | + super(ApplicationWindow, self).__init__() |
| 30 | + self._main = QtWidgets.QWidget() |
| 31 | + self.setCentralWidget(self._main) |
| 32 | + layout = QtWidgets.QVBoxLayout(self._main) |
| 33 | + |
| 34 | + static_canvas = FigureCanvas(Figure(figsize=(5, 3))) |
| 35 | + layout.addWidget(static_canvas) |
| 36 | + self.addToolBar(NavigationToolbar(static_canvas, self)) |
| 37 | + |
| 38 | + dynamic_canvas = FigureCanvas(Figure(figsize=(5, 3))) |
| 39 | + layout.addWidget(dynamic_canvas) |
| 40 | + self.addToolBar(QtCore.Qt.BottomToolBarArea, |
| 41 | + NavigationToolbar(dynamic_canvas, self)) |
| 42 | + |
| 43 | + self._static_ax = static_canvas.figure.subplots() |
| 44 | + t = np.linspace(0, 10, 501) |
| 45 | + self._static_ax.plot(t, np.tan(t), ".") |
| 46 | + |
| 47 | + self._dynamic_ax = dynamic_canvas.figure.subplots() |
| 48 | + self._timer = dynamic_canvas.new_timer( |
| 49 | + 100, [(self._update_canvas, (), {})]) |
| 50 | + self._timer.start() |
| 51 | + |
| 52 | + def _update_canvas(self): |
| 53 | + self._dynamic_ax.clear() |
| 54 | + t = np.linspace(0, 10, 101) |
| 55 | + # Shift the sinusoid as a function of time. |
| 56 | + self._dynamic_ax.plot(t, np.sin(t + time.time())) |
| 57 | + self._dynamic_ax.figure.canvas.draw() |
| 58 | + |
| 59 | + |
| 60 | +if __name__ == "__main__": |
| 61 | + qapp = QtWidgets.QApplication(sys.argv) |
| 62 | + app = ApplicationWindow() |
| 63 | + app.show() |
| 64 | + qapp.exec_() |
0 commit comments