{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%gui qt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n# Control VisPy from Qt\n\nControl a VisPy visualization with Qt-based (PyQt5) UI elements.\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\nCOLORMAP_CHOICES = [\"viridis\", \"reds\", \"blues\"]\nLINE_COLOR_CHOICES = [\"black\", \"red\", \"blue\"]\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 self._connect_controls()\n\n def _connect_controls(self):\n self._controls.colormap_chooser.currentTextChanged.connect(self._canvas_wrapper.set_image_colormap)\n self._controls.line_color_chooser.currentTextChanged.connect(self._canvas_wrapper.set_line_color)\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(COLORMAP_CHOICES)\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(LINE_COLOR_CHOICES)\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=COLORMAP_CHOICES[0],\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=LINE_COLOR_CHOICES[0])\n self.view_bot.camera = \"panzoom\"\n self.view_bot.camera.set_range(x=(0, NUM_LINE_POINTS), y=(0, 1))\n\n def set_image_colormap(self, cmap_name: str):\n print(f\"Changing image colormap to {cmap_name}\")\n self.image.cmap = cmap_name\n\n def set_line_color(self, color):\n print(f\"Changing line color to {color}\")\n self.line.set_data(color=color)\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 }