{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%gui qt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n# Embed VisPy into Qt\n\nDisplay VisPy visualizations in a PyQt5 application.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\nfrom PyQt5 import QtWidgets\n\nfrom vispy.scene import SceneCanvas, visuals\nfrom vispy.app import use_app\n\nIMAGE_SHAPE = (600, 800) # (height, width)\nCANVAS_SIZE = (800, 600) # (width, height)\nNUM_LINE_POINTS = 200\n\n\nclass MyMainWindow(QtWidgets.QMainWindow):\n def __init__(self, *args, **kwargs):\n super().__init__(*args, **kwargs)\n\n central_widget = QtWidgets.QWidget()\n main_layout = QtWidgets.QHBoxLayout()\n\n self._controls = Controls()\n main_layout.addWidget(self._controls)\n self._canvas_wrapper = CanvasWrapper()\n main_layout.addWidget(self._canvas_wrapper.canvas.native)\n\n central_widget.setLayout(main_layout)\n self.setCentralWidget(central_widget)\n\n\nclass Controls(QtWidgets.QWidget):\n def __init__(self, parent=None):\n super().__init__(parent)\n layout = QtWidgets.QVBoxLayout()\n self.colormap_label = QtWidgets.QLabel(\"Image Colormap:\")\n layout.addWidget(self.colormap_label)\n self.colormap_chooser = QtWidgets.QComboBox()\n self.colormap_chooser.addItems([\"viridis\", \"reds\", \"blues\"])\n layout.addWidget(self.colormap_chooser)\n\n self.line_color_label = QtWidgets.QLabel(\"Line color:\")\n layout.addWidget(self.line_color_label)\n self.line_color_chooser = QtWidgets.QComboBox()\n self.line_color_chooser.addItems([\"black\", \"red\", \"blue\"])\n layout.addWidget(self.line_color_chooser)\n\n layout.addStretch(1)\n self.setLayout(layout)\n\n\nclass CanvasWrapper:\n def __init__(self):\n self.canvas = SceneCanvas(size=CANVAS_SIZE)\n self.grid = self.canvas.central_widget.add_grid()\n\n self.view_top = self.grid.add_view(0, 0, bgcolor='cyan')\n image_data = _generate_random_image_data(IMAGE_SHAPE)\n self.image = visuals.Image(\n image_data,\n texture_format=\"auto\",\n cmap=\"viridis\",\n parent=self.view_top.scene,\n )\n self.view_top.camera = \"panzoom\"\n self.view_top.camera.set_range(x=(0, IMAGE_SHAPE[1]), y=(0, IMAGE_SHAPE[0]), margin=0)\n\n self.view_bot = self.grid.add_view(1, 0, bgcolor='#c0c0c0')\n line_data = _generate_random_line_positions(NUM_LINE_POINTS)\n self.line = visuals.Line(line_data, parent=self.view_bot.scene, color='black')\n self.view_bot.camera = \"panzoom\"\n self.view_bot.camera.set_range(x=(0, NUM_LINE_POINTS), y=(0, 1))\n\n\ndef _generate_random_image_data(shape, dtype=np.float32):\n rng = np.random.default_rng()\n data = rng.random(shape, dtype=dtype)\n return data\n\n\ndef _generate_random_line_positions(num_points, dtype=np.float32):\n rng = np.random.default_rng()\n pos = np.empty((num_points, 2), dtype=np.float32)\n pos[:, 0] = np.arange(num_points)\n pos[:, 1] = rng.random((num_points,), dtype=dtype)\n return pos\n\n\nif __name__ == \"__main__\":\n app = use_app(\"pyqt5\")\n app.create()\n win = MyMainWindow()\n win.show()\n app.run()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.19" } }, "nbformat": 4, "nbformat_minor": 0 }