Merge branch 'master' into ptree
This commit is contained in:
commit
7b3fdda1e4
55
.github/workflows/codeql-analysis.yml
vendored
Normal file
55
.github/workflows/codeql-analysis.yml
vendored
Normal file
@ -0,0 +1,55 @@
|
||||
name: codeql
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: analyze
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
# We must fetch at least the immediate parents so that if this is
|
||||
# a pull request then we can checkout the head.
|
||||
fetch-depth: 2
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: '3.9'
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install PyQt5 numpy scipy
|
||||
echo "CODEQL_PYTHON=$(which python)" >> $GITHUB_ENV
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
with:
|
||||
languages: 'python'
|
||||
# Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
queries: +security-and-quality
|
||||
setup-python-dependencies: false
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
155
.github/workflows/main.yml
vendored
Normal file
155
.github/workflows/main.yml
vendored
Normal file
@ -0,0 +1,155 @@
|
||||
name: main
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ${{ matrix.os }}
|
||||
timeout-minutes: 30
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-20.04 , windows-latest, macos-latest]
|
||||
qt-lib: [pyqt, pyside]
|
||||
python-version: [3.7, 3.8, 3.9]
|
||||
include:
|
||||
- python-version: "3.7"
|
||||
qt-lib: "pyqt"
|
||||
qt-version: "PyQt5~=5.12.0"
|
||||
numpy-version: "~=1.17.0"
|
||||
- python-version: "3.7"
|
||||
qt-lib: "pyside"
|
||||
qt-version: "PySide2~=5.12.0"
|
||||
numpy-version: "~=1.17.0"
|
||||
- python-version: "3.8"
|
||||
qt-lib: "pyqt"
|
||||
qt-version: "PyQt5~=5.15.0"
|
||||
numpy-version: "~=1.19.0"
|
||||
- python-version: "3.8"
|
||||
qt-lib: "pyside"
|
||||
qt-version: "PySide2~=5.15.0"
|
||||
numpy-version: "~=1.19.0"
|
||||
- python-version: "3.9"
|
||||
qt-lib: "pyqt"
|
||||
qt-version: "PyQt6"
|
||||
numpy-version: "~=1.19.0"
|
||||
- python-version: "3.9"
|
||||
qt-lib: "pyside"
|
||||
qt-version: "PySide6"
|
||||
numpy-version: "~=1.19.0"
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Checkout test-data
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: pyqtgraph/test-data
|
||||
path: .pyqtgraph/test-data
|
||||
- name: Setup Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
# Semantic version range syntax or exact version of a Python version
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: "Install Windows-Mesa OpenGL DLL"
|
||||
if: runner.os == 'Windows'
|
||||
run: |
|
||||
curl -LJO https://github.com/pal1000/mesa-dist-win/releases/download/19.2.7/mesa3d-19.2.7-release-msvc.7z
|
||||
7z x mesa3d-19.2.7-release-msvc.7z
|
||||
cd x64
|
||||
xcopy opengl32.dll C:\windows\system32\mesadrv.dll*
|
||||
xcopy opengl32.dll C:\windows\syswow64\mesadrv.dll*
|
||||
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v DLL /t REG_SZ /d "mesadrv.dll" /f
|
||||
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v DriverVersion /t REG_DWORD /d 1 /f
|
||||
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v Flags /t REG_DWORD /d 1 /f
|
||||
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v Version /t REG_DWORD /d 2 /f
|
||||
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v DLL /t REG_SZ /d "mesadrv.dll" /f
|
||||
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v DriverVersion /t REG_DWORD /d 1 /f
|
||||
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v Flags /t REG_DWORD /d 1 /f
|
||||
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v Version /t REG_DWORD /d 2 /f
|
||||
shell: cmd
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
pip install --upgrade pip
|
||||
pip install ${{ matrix.qt-version }} numpy${{ matrix.numpy-version }} scipy pyopengl h5py matplotlib
|
||||
pip install .
|
||||
pip install pytest pytest-cov pytest-xdist coverage
|
||||
- name: "Install Linux VirtualDisplay"
|
||||
if: runner.os == 'Linux'
|
||||
run: |
|
||||
sudo apt-get update -y
|
||||
sudo apt-get install -y libxkbcommon-x11-0 x11-utils
|
||||
sudo apt-get install --no-install-recommends -y libyaml-dev libegl1-mesa libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xinerama0
|
||||
sudo apt-get install -y libopengl0
|
||||
pip install pytest-xvfb
|
||||
- name: 'Debug Info'
|
||||
run: |
|
||||
echo python location: `which python`
|
||||
echo python version: `python --version`
|
||||
echo pytest location: `which pytest`
|
||||
echo installed packages
|
||||
pip list
|
||||
echo pyqtgraph system info
|
||||
python -c "import pyqtgraph as pg; pg.systemInfo()"
|
||||
shell: bash
|
||||
env:
|
||||
QT_DEBUG_PLUGINS: 1
|
||||
- name: 'XVFB Display Info'
|
||||
run: |
|
||||
xvfb-run --server-args="-screen 0, 1920x1200x24 -ac +extension GLX +render -noreset" python -c "from pyqtgraph.opengl.glInfo import GLTest"
|
||||
xvfb-run --server-args="-screen 0, 1920x1200x24 -ac +extension GLX +render -noreset" python -m pyqtgraph.util.get_resolution
|
||||
if: runner.os == 'Linux'
|
||||
- name: 'Display Info'
|
||||
run: |
|
||||
python -c "from pyqtgraph.opengl.glInfo import GLTest"
|
||||
python -m pyqtgraph.util.get_resolution
|
||||
if: runner.os != 'Linux'
|
||||
- name: Run Tests
|
||||
run: |
|
||||
mkdir $SCREENSHOT_DIR
|
||||
pytest . -v \
|
||||
-n auto \
|
||||
--junitxml pytest.xml \
|
||||
--cov pyqtgraph --cov-report=xml --cov-report=html
|
||||
shell: bash
|
||||
- name: Upload Screenshots
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: Screenshots (Python ${{ matrix.python-version }} - Qt-Bindings ${{ matrix.qt-lib }} - OS ${{ matrix.os }})
|
||||
path: $SCREENSHOT_DIR
|
||||
if-no-files-found: ignore
|
||||
env:
|
||||
SCREENSHOT_DIR: ./screenshots
|
||||
|
||||
build-docs:
|
||||
name: build docs
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Setup Python 3.9
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: '3.9'
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
cd doc
|
||||
python -m pip install -r requirements.txt
|
||||
- name: Build Documentation
|
||||
run: |
|
||||
cd doc
|
||||
make html SPHINXOPTS='-W --keep-going -v'
|
||||
|
||||
build-wheel:
|
||||
name: build wheel
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Setup Python 3.9
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: '3.9'
|
||||
- name: Build Wheel
|
||||
run: |
|
||||
python -m pip install setuptools wheel
|
||||
python setup.py bdist_wheel
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -107,3 +107,4 @@ rtr.cvs
|
||||
# ctags
|
||||
.tags*
|
||||
|
||||
.asv/
|
||||
|
166
CHANGELOG
166
CHANGELOG
@ -1,3 +1,169 @@
|
||||
pyqtgraph-0.11.1
|
||||
|
||||
New Features:
|
||||
- #800 Legend for bar graphs
|
||||
- #1244 Arrow scatter symbols
|
||||
- #161 Allow hiding individulal points in scatter plot
|
||||
- #395 LegendItem display options
|
||||
- #1310 Added `Pa` to Units
|
||||
- #1310 `debug.ThreadTrace` add support for thread names
|
||||
- #117 Flow Chart Nodes now resized based on number of inputs/outputs
|
||||
- #1154 `DateAxisItem`
|
||||
- #1285 Improve control over ROI/handle pens
|
||||
- #1273 `PColorMeshItem`
|
||||
- #1397 `LegendItem` enable customization of label text size
|
||||
- #1422 Permit entry of non-finite values into float `SpinBox`
|
||||
- #1442 `TickSliderItem.allowRemote` property added
|
||||
- #1441 `Tick.removeAllowed` is now a regular property and used with `TickSliderItem`
|
||||
- #1388 Emit a signal when `GraphicsScene` `addItem` or `removeItem` methods called
|
||||
|
||||
Performance enhancement:
|
||||
- #1240/#345 GLImageItem clear need update flag
|
||||
- #977 Faster computation option for pseudoscatter
|
||||
- #1297 Improve ArrowItem performance
|
||||
- #1296 Update `h5py` deps in metaarray
|
||||
- #1295 Improve TextItem performance
|
||||
- #1283 Performance improvements to arrayToQPath
|
||||
- #816 Avoid constructing shadow pens when no shadow pen is set
|
||||
- #1311 HistogramLUTItem detect trivial gradients
|
||||
- #1312 avoid extra work when setLabelAngle would have no effect
|
||||
- #1391 cache viewRect of `GraphicsItem` to reduce CPU load
|
||||
- #150 Slight speedup to ViewBox panning
|
||||
- #1420 Many ScatterPlot Improvements
|
||||
|
||||
API/Behavior Change:
|
||||
- #496 Always antialias lines between gradient and region in HistogramLUTItem
|
||||
- #385 Add headWidth parameter to arrows
|
||||
- #551 fps variable on ImageView
|
||||
- #1251 Allow explict utcOffset timezone in DateAxisItem
|
||||
- #1310 Add `SignalProxy.block` for temporary disabling of signal forwarding
|
||||
- #1310 `InfiniteLine.setPos` add support for array argument
|
||||
- #1310 Rate-limit Qt event processing in ProgressDialog if it is modal
|
||||
- #1289 Disable autoSIPrefix for DateAxisItem by default
|
||||
- #1274 Add tickAlpha to AxisItem Style Options
|
||||
- #402 Added `clear()` method to `GLViewWidget`
|
||||
- #1264 Added exception to checkOpenGLVersion to highlight OpenGL ES incompatability
|
||||
- #1257 Make painter tick font dependent for AxisItem
|
||||
- #1256 Added `setState`, `setState` and `saveState` to `ROI`
|
||||
- #1324 Pass through kwargs from MultiPlotItem.plot to PlotItem.plot
|
||||
- #1387 ScatterPlotItem: Make + and x symbols thicker
|
||||
- #1362 Make flowchart.Terminal sortable
|
||||
- #1360 Add "left" and "right" step Modes to PlotCurveItem and PlotDataItem
|
||||
- #1414 Emit event with mouse clicks for some items
|
||||
- #1413 `InfiniteLine.viewTransformChanged` now calls superclass-method
|
||||
- #1411 Hide `WidgetParameterItem.defaultBtn` if param has no default
|
||||
- #1410 add fontSize kwarg to `Dock`
|
||||
- #159 Add wrapping option to `SpinBox`
|
||||
- #330 Set parameter default button `autoDefault` value to `False`
|
||||
- #157 Provide `WidgetGroupInterface` to `GradientWidget`
|
||||
- #151 Optional provide custom `PlotItem` to `PlotWidget`
|
||||
- #1140 Dynamic range limiting in `PlotDataItem`
|
||||
- #1383 GraphicsView set a transparent background palette
|
||||
- #1428 Add default color for `ColorMap` type in `ColorMapWidget`
|
||||
|
||||
Bug Fixes:
|
||||
- #1239 Avoid adding PlotItem twice
|
||||
- #508 siScale precision
|
||||
- #503 Fix butg in RawImageWidget which resulted in mirrored image
|
||||
- #1242,#1267 Add the mouse event to the sigClicked signal in PlotCurveItem
|
||||
- #1247 Restore the now-deprecated PlotWindow and ImageWindow classes
|
||||
- #1249 Remove ScatterPlotItem's SpotItems during addItem call
|
||||
- #1252 Fix incorrect tick text boundaries calculation on axis by setting the font
|
||||
- #1310 Fixed `Vector.__init__` when used with `QVector3D` argument
|
||||
- #1310 Fix console exception filtering for python3
|
||||
- #1310 BusyCursor only restore cursor after all nested levels have exited
|
||||
- #1310 `SimpleParameter.setValue` coerces argument to int if parameter type is int
|
||||
- #1307 Fixed `reload` methods for python3
|
||||
- #1294 Various console fixes
|
||||
- #1293 Various Python3 code fixes
|
||||
- #1282 Handle Axis SI prefix scaling in MatplotlibExporter
|
||||
- #1276 Fix problems with high frequency gaming mice
|
||||
- #1270 Various fixes with AxisItem space being taken
|
||||
- #1272 `LegendItem.clear()` fixed
|
||||
- #1268 Check for container before setting dock orientation
|
||||
- #1312 Avoid divide by 0 condition in TargetItem
|
||||
- #1309 Properly retain and use hoverPen argument in _PolyLineSegment
|
||||
- #1371 Explicitly set line width in PlotCurveItem when using OpenGL
|
||||
- #1319 don't automatically reload modules without pyc
|
||||
- #1319 make ptime.time on py3 return precision wall-clock time
|
||||
- #1334 Edge case detection in PlotCurveItem
|
||||
- #1339 fix handling of QVector3D args in Vector.__init__
|
||||
- #1336 Make `parent` an explicit kwarg of ArrowItem.__init__, avoid passing into setStyle
|
||||
- #1368 Disconnect from correct slots in Flowchart
|
||||
- #1364 fix log scaling
|
||||
- #963 Allow last image in stack to be selected by slider in ImageView
|
||||
- #1045 Raise AttributeError in __getattr__ in TabWindow
|
||||
- #960 Work around PySide setOverrideCursor bug in BusyCursor
|
||||
- #309 Encode QPropertyAnimation property name if not passed as bytes
|
||||
- #1072 Fix storing of ragged curves in HDF5Exporter
|
||||
- #1275 Fix Parameter.hasDefault
|
||||
- #1291 Get ImageView ROI working with both row and col major data
|
||||
- #1377 Consolidate and fix downsample factor computation in ImageItem
|
||||
- #1376 Fix PlotItem.setAxisItems
|
||||
- #1392 SignalProxy: Correct initialization without slot argument
|
||||
- #1306 Fix incorrect rendering of overlapping object in renderToArray()
|
||||
- #1349 Avoid calling method on undefined attribute
|
||||
- #1367 AxisItem: Account for empty strings in the visibility of text and units
|
||||
- #1356 Fix `ParameterTree` tree name and title handling
|
||||
- #1419 Fix `DataTreeWidget` dict sorting crash
|
||||
- #1408 Fix mouse interaction issues with `DockLabel`
|
||||
- #329 Fix bug where `int` and `float` parameter limits are not always set
|
||||
- #158 Make `DockArea` compatible with Qt Designer
|
||||
- #1405 Fix name setting in `ScatterPlotItem` options
|
||||
- #1403 Do not apply transparent background to Qt4
|
||||
- #1468 Allow zero step in `ImageItem`
|
||||
- #1464 Remove `ViewBox.childGroup`'s `ItemClipsChildrenToShape` flag
|
||||
- #1461 arrayToQPath revert to old behavior of `connect=ndarray` parameter
|
||||
- #1459 Fix `TickSliderItem` to avoid ghost ticks
|
||||
- #1456 Resolve issue with `PlotCurveItem` with merging PRs in an incorrect order
|
||||
- #1287 Fill in non-finite plot values for Qt versions >= 5.12.3
|
||||
- #1447 Clipped AxisItem tick value labels to prevent drawing artifacts
|
||||
- #1435 Fix autosize not taking to the correct range with `TextItem` in view
|
||||
- #1452 merge `InfiniteLine` caching calls
|
||||
- #1446 Fix `PlotDataItem.setData([], [])`
|
||||
- #1443 Fix Viewbox axis zoom in RectMode
|
||||
- #1439 Fix `TickSliderItem.setTickValue` when it references a `GradientEditorItem` method
|
||||
- #1361 Prevent item duplication in `Node` context menu
|
||||
- #1423 Fix typo in `kwargs` for `GridItem.setTextPen`
|
||||
- #1401 Fix width, height and background in SVG exporter
|
||||
- #1416 Handle case in `ROI` when `shape`, `vectors`, or `origin` keywords are passed in
|
||||
|
||||
Maintenance:
|
||||
- #389 Revert workaround for upstream QT bug regarding mouse events
|
||||
- #1243 Ensure setPos in ROI is initialized correctly
|
||||
- #1241 Pin pytest-xvfb version on py2
|
||||
- #1310 Added tests for `functions.subArray`
|
||||
- #1307 Add `ThreadSafeTimer` to `__init__.py`
|
||||
- #467 derivatePlots cleanup
|
||||
- #400 `ImageView.Timeline` better visibility
|
||||
- #1265 Make the documentation reproducible
|
||||
- #1319 clean up exception messages in console
|
||||
- #356 Fix some NumPy warnings
|
||||
- #1326 Improve docs for MultiPlotWidget and MultiPlotItem
|
||||
- #1331 Migrate imports of PyQt5's sip module to new namespace
|
||||
- #1370 Fix deprecation warning in multiprocess module
|
||||
- #308 Fix opt name for SpinBox: range -> bounds in UnsharpMaskNode example
|
||||
- #887 Update collections.abc imports
|
||||
- #1142 Miscellaneous doc fixups
|
||||
- #1169 Avoid using mutable default argument value
|
||||
- #1073 Python3 fixes
|
||||
- #1284 Update doc strings to clarify getArrayRegion API for ROI subclasses
|
||||
- #1042 Close windows at the end of test functions
|
||||
- #1374 Test warnings cleanup
|
||||
- #1375 Add targeted Vector test coverage
|
||||
- #1384 GLViewWidget.pan docstring typo
|
||||
- #1382 Autoformat LegendItem
|
||||
- #1396 Add tests for GraphicsView
|
||||
- #1399 Disable mouse rate limiting on test_ROI
|
||||
- #1409 Prepend conda-forge channel prior to env creation in CI
|
||||
- #1302 Fix Example app now works with Qt4/Python2
|
||||
- #1402 Handle case of version string having no `+`
|
||||
- #1400 Fix sphinx warnings on `PColorMeshItem`
|
||||
- #1328 Add docs build job to CI
|
||||
- #1464 Use `conda-forge` on pyside2+linux
|
||||
- #1448 Fixes for `examples/CustomPlot.py`
|
||||
- #1432 ExampleApp fix to use `pg` module from directory
|
||||
|
||||
pyqtgraph-0.11.0
|
||||
|
||||
NOTICE: This is the _last_ feature release to support Python 2 and Qt 4 (PyQt4 or pyside 1)
|
||||
|
58
README.md
58
README.md
@ -1,11 +1,15 @@
|
||||
|
||||
[![Build Status](https://pyqtgraph.visualstudio.com/pyqtgraph/_apis/build/status/pyqtgraph.pyqtgraph?branchName=master)](https://pyqtgraph.visualstudio.com/pyqtgraph/_build/latest?definitionId=17&branchName=master)
|
||||
[![Documentation Status](https://readthedocs.org/projects/pyqtgraph/badge/?version=latest)](https://pyqtgraph.readthedocs.io/en/latest/?badge=latest)
|
||||
|
||||
PyQtGraph
|
||||
=========
|
||||
|
||||
A pure-Python graphics library for PyQt/PySide/PyQt5/PySide2
|
||||
[![PyPi](https://img.shields.io/pypi/v/pyqtgraph.svg)](https://pypi.org/project/pyqtgraph/)
|
||||
[![conda-forge](https://img.shields.io/conda/vn/conda-forge/pyqtgraph.svg)](https://anaconda.org/conda-forge/pyqtgraph)
|
||||
[![Build Status](https://github.com/pyqtgraph/pyqtgraph/workflows/main/badge.svg)](https://github.com/pyqtgraph/pyqtgraph/actions/?query=workflow%3Amain)
|
||||
[![CodeQL Status](https://github.com/pyqtgraph/pyqtgraph/workflows/codeql/badge.svg)](https://github.com/pyqtgraph/pyqtgraph/actions/?query=workflow%3Acodeql)
|
||||
[![Documentation Status](https://readthedocs.org/projects/pyqtgraph/badge/?version=latest)](https://pyqtgraph.readthedocs.io/en/latest/?badge=latest)
|
||||
[![Total alerts](https://img.shields.io/lgtm/alerts/g/pyqtgraph/pyqtgraph.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/pyqtgraph/pyqtgraph/alerts/)
|
||||
[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/pyqtgraph/pyqtgraph.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/pyqtgraph/pyqtgraph/context:python)
|
||||
|
||||
A pure-Python graphics library for PyQt5/PyQt6/PySide2/PySide6
|
||||
|
||||
Copyright 2020 Luke Campagnola, University of North Carolina at Chapel Hill
|
||||
|
||||
@ -19,31 +23,43 @@ heavy leverage of numpy for number crunching, Qt's GraphicsView framework for
|
||||
Requirements
|
||||
------------
|
||||
|
||||
* Python 2.7, or 3.x
|
||||
pyqtgraph has adopted [NEP 29](https://numpy.org/neps/nep-0029-deprecation_policy.html).
|
||||
|
||||
This project supports:
|
||||
|
||||
* All minor versions of Python released 42 months prior to the project, and at minimum the two latest minor versions.
|
||||
* All minor versions of numpy released in the 24 months prior to the project, and at minimum the last three minor versions.
|
||||
* All minor versions of Qt 5 and Qt 6 currently supported by upstream Qt
|
||||
|
||||
Currently this means:
|
||||
|
||||
* Python 3.7+
|
||||
* Qt 5.12-6.0
|
||||
* Required
|
||||
* PyQt 4.8+, PySide, PyQt5, or PySide2
|
||||
* `numpy`
|
||||
* PyQt5, PyQt6, PySide2 or PySide6
|
||||
* `numpy` 1.17+
|
||||
* Optional
|
||||
* `scipy` for image processing
|
||||
* `pyopengl` for 3D graphics
|
||||
* `pyopengl` on macOS Big Sur only works with python 3.9.1+
|
||||
* `hdf5` for large hdf5 binary format support
|
||||
* `colorcet` for supplemental colormaps
|
||||
* [`cupy`](https://docs.cupy.dev/en/stable/install.html) for CUDA-enhanced image processing
|
||||
* On Windows, CUDA toolkit must be >= 11.1
|
||||
|
||||
Qt Bindings Test Matrix
|
||||
-----------------------
|
||||
|
||||
The following table represents the python environments we test in our CI system. Our CI system uses Ubuntu 18.04, Windows Server 2019, and macOS 10.15 base images.
|
||||
The following table represents the python environments we test in our CI system. Our CI system uses Ubuntu 20.04, Windows Server 2019, and macOS 10.15 base images.
|
||||
|
||||
| Qt-Bindings | Python 2.7 | Python 3.6 | Python 3.7 | Python 3.8 |
|
||||
| :------------- | :----------------: | :----------------: | :----------------: | :----------------: |
|
||||
| PyQt-4 | :white_check_mark: | :x: | :x: | :x: |
|
||||
| PySide1 | :white_check_mark: | :x: | :x: | :x: |
|
||||
| PyQt5-5.9 | :x: | :white_check_mark: | :x: | :x: |
|
||||
| PySide2-5.13 | :x: | :x: | :white_check_mark: | :x: |
|
||||
| PyQt5-Latest | :x: | :x: | :x: | :white_check_mark: |
|
||||
| PySide2-Latest | :x: | :x: | :x: | :white_check_mark: |
|
||||
|
||||
* pyqtgraph has had some incompatibilities with PySide2 versions 5.6-5.11, and we recommend you avoid those versions if possible
|
||||
* on macOS with Python 2.7 and Qt4 bindings (PyQt4 or PySide) the openGL related visualizations do not work reliably
|
||||
| Qt-Bindings | Python 3.7 | Python 3.8 | Python 3.9 |
|
||||
| :------------- | :----------------: | :----------------: | :----------------: |
|
||||
| PySide2-5.12 | :white_check_mark: | :x: | :x: |
|
||||
| PyQt5-5.12 | :white_check_mark: | :x: | :x: |
|
||||
| PySide2-5.15 | :x: | :white_check_mark: | :x: |
|
||||
| PyQt5-5.15 | :x: | :white_check_mark: | :x: |
|
||||
| PySide6-6.0 | :x: | :x: | :white_check_mark: |
|
||||
| PyQt6-6.0 | :x: | :x: | :white_check_mark: |
|
||||
|
||||
Support
|
||||
-------
|
||||
@ -67,6 +83,6 @@ Installation Methods
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
The official documentation lives at https://pyqtgraph.readthedocs.io
|
||||
The official documentation lives at [pyqtgraph.readthedocs.io](https://pyqtgraph.readthedocs.io)
|
||||
|
||||
The easiest way to learn pyqtgraph is to browse through the examples; run `python -m pyqtgraph.examples` to launch the examples application.
|
||||
|
140
asv.conf.json
Normal file
140
asv.conf.json
Normal file
@ -0,0 +1,140 @@
|
||||
{
|
||||
// The version of the config file format. Do not change, unless
|
||||
// you know what you are doing.
|
||||
"version": 1,
|
||||
|
||||
// The name of the project being benchmarked
|
||||
"project": "pyqtgraph",
|
||||
|
||||
// The project's homepage
|
||||
"project_url": "http://pyqtgraph.org/",
|
||||
|
||||
// The URL or local path of the source code repository for the
|
||||
// project being benchmarked
|
||||
"repo": ".",
|
||||
|
||||
// List of branches to benchmark. If not provided, defaults to "master"
|
||||
// (for git) or "default" (for mercurial).
|
||||
"branches": ["master"], // for git
|
||||
// "branches": ["default"], // for mercurial
|
||||
|
||||
// The DVCS being used. If not set, it will be automatically
|
||||
// determined from "repo" by looking at the protocol in the URL
|
||||
// (if remote), or by looking for special directories, such as
|
||||
// ".git" (if local).
|
||||
// "dvcs": "git",
|
||||
|
||||
// The tool to use to create environments. May be "conda",
|
||||
// "virtualenv" or other value depending on the plugins in use.
|
||||
// If missing or the empty string, the tool will be automatically
|
||||
// determined by looking for tools on the PATH environment
|
||||
// variable.
|
||||
"environment_type": "conda",
|
||||
|
||||
// timeout in seconds for installing any dependencies in environment
|
||||
// defaults to 10 min
|
||||
//"install_timeout": 600,
|
||||
|
||||
// the base URL to show a commit for the project.
|
||||
"show_commit_url": "http://github.com/pyqtgraph/pyqtgraph/commit/",
|
||||
|
||||
// The Pythons you'd like to test against. If not provided, defaults
|
||||
// to the current version of Python used to run `asv`.
|
||||
"pythons": ["2.7", "3.8"],
|
||||
|
||||
// The matrix of dependencies to test. Each key is the name of a
|
||||
// package (in PyPI) and the values are version numbers. An empty
|
||||
// list or empty string indicates to just test against the default
|
||||
// (latest) version. null indicates that the package is to not be
|
||||
// installed. If the package to be tested is only available from
|
||||
// PyPi, and the 'environment_type' is conda, then you can preface
|
||||
// the package name by 'pip+', and the package will be installed via
|
||||
// pip (with all the conda available packages installed first,
|
||||
// followed by the pip installed packages).
|
||||
//
|
||||
"matrix": {
|
||||
"numpy": [],
|
||||
"numba": [],
|
||||
"pyqt": ["4", "5"],
|
||||
},
|
||||
|
||||
// Combinations of libraries/python versions can be excluded/included
|
||||
// from the set to test. Each entry is a dictionary containing additional
|
||||
// key-value pairs to include/exclude.
|
||||
//
|
||||
// An exclude entry excludes entries where all values match. The
|
||||
// values are regexps that should match the whole string.
|
||||
//
|
||||
// An include entry adds an environment. Only the packages listed
|
||||
// are installed. The 'python' key is required. The exclude rules
|
||||
// do not apply to includes.
|
||||
//
|
||||
// In addition to package names, the following keys are available:
|
||||
//
|
||||
// - python
|
||||
// Python version, as in the *pythons* variable above.
|
||||
// - environment_type
|
||||
// Environment type, as above.
|
||||
// - sys_platform
|
||||
// Platform, as in sys.platform. Possible values for the common
|
||||
// cases: 'linux2', 'win32', 'cygwin', 'darwin'.
|
||||
//
|
||||
"exclude": [
|
||||
{"python": "3.8", "pyqt": "4"},
|
||||
],
|
||||
//
|
||||
// "include": [
|
||||
// // additional env for python2.7
|
||||
// {"python": "2.7", "numpy": "1.8"},
|
||||
// // additional env if run on windows+conda
|
||||
// {"platform": "win32", "environment_type": "conda", "python": "2.7", "libpython": ""},
|
||||
// ],
|
||||
|
||||
// The directory (relative to the current directory) that benchmarks are
|
||||
// stored in. If not provided, defaults to "benchmarks"
|
||||
"benchmark_dir": "benchmarks",
|
||||
|
||||
// The directory (relative to the current directory) to cache the Python
|
||||
// environments in. If not provided, defaults to "env"
|
||||
"env_dir": ".asv/env",
|
||||
|
||||
// The directory (relative to the current directory) that raw benchmark
|
||||
// results are stored in. If not provided, defaults to "results".
|
||||
"results_dir": ".asv/results",
|
||||
|
||||
// The directory (relative to the current directory) that the html tree
|
||||
// should be written to. If not provided, defaults to "html".
|
||||
"html_dir": ".asv/html",
|
||||
|
||||
// The number of characters to retain in the commit hashes.
|
||||
// "hash_length": 8,
|
||||
|
||||
// `asv` will cache wheels of the recent builds in each
|
||||
// environment, making them faster to install next time. This is
|
||||
// number of builds to keep, per environment.
|
||||
"build_cache_size": 5
|
||||
|
||||
// The commits after which the regression search in `asv publish`
|
||||
// should start looking for regressions. Dictionary whose keys are
|
||||
// regexps matching to benchmark names, and values corresponding to
|
||||
// the commit (exclusive) after which to start looking for
|
||||
// regressions. The default is to start from the first commit
|
||||
// with results. If the commit is `null`, regression detection is
|
||||
// skipped for the matching benchmark.
|
||||
//
|
||||
// "regressions_first_commits": {
|
||||
// "some_benchmark": "352cdf", // Consider regressions only after this commit
|
||||
// "another_benchmark": null, // Skip regression detection altogether
|
||||
// }
|
||||
|
||||
// The thresholds for relative change in results, after which `asv
|
||||
// publish` starts reporting regressions. Dictionary of the same
|
||||
// form as in ``regressions_first_commits``, with values
|
||||
// indicating the thresholds. If multiple entries match, the
|
||||
// maximum is taken. If no entry matches, the default is 5%.
|
||||
//
|
||||
// "regressions_thresholds": {
|
||||
// "some_benchmark": 0.01, // Threshold of 1%
|
||||
// "another_benchmark": 0.5, // Threshold of 50%
|
||||
// }
|
||||
}
|
@ -1,113 +0,0 @@
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- '*' # Build for all branches if they have a azure-pipelines.yml file.
|
||||
tags:
|
||||
include:
|
||||
- 'v*' # Ensure that we are building for tags starting with 'v' (Official Versions)
|
||||
|
||||
# Build only for PRs for master branch
|
||||
pr:
|
||||
autoCancel: true
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- develop
|
||||
|
||||
variables:
|
||||
OFFICIAL_REPO: 'pyqtgraph/pyqtgraph'
|
||||
DEFAULT_MERGE_BRANCH: 'master'
|
||||
disable.coverage.autogenerate: 'true'
|
||||
|
||||
stages:
|
||||
- stage: pre_build
|
||||
jobs:
|
||||
- job: check_diff_size
|
||||
pool:
|
||||
vmImage: 'Ubuntu 18.04'
|
||||
steps:
|
||||
- bash: |
|
||||
git config --global advice.detachedHead false
|
||||
mkdir ~/repo-clone && cd ~/repo-clone
|
||||
git init
|
||||
|
||||
git remote add -t $(Build.SourceBranchName) origin $(Build.Repository.Uri)
|
||||
git remote add -t ${DEFAULT_MERGE_BRANCH} upstream https://github.com/${OFFICIAL_REPO}.git
|
||||
|
||||
git fetch origin $(Build.SourceBranchName)
|
||||
git fetch upstream ${DEFAULT_MERGE_BRANCH}
|
||||
|
||||
git checkout $(Build.SourceBranchName)
|
||||
MERGE_SIZE=`du -s . | sed -e "s/\t.*//"`
|
||||
echo -e "Merge Size ${MERGE_SIZE}"
|
||||
|
||||
git checkout ${DEFAULT_MERGE_BRANCH}
|
||||
TARGET_SIZE=`du -s . | sed -e "s/\t.*//"`
|
||||
echo -e "Target Size ${TARGET_SIZE}"
|
||||
|
||||
if [ "${MERGE_SIZE}" != "${TARGET_SIZE}" ]; then
|
||||
SIZE_DIFF=`expr \( ${MERGE_SIZE} - ${TARGET_SIZE} \)`;
|
||||
else
|
||||
SIZE_DIFF=0;
|
||||
fi;
|
||||
echo -e "Estimated content size difference = ${SIZE_DIFF} kB" &&
|
||||
test ${SIZE_DIFF} -lt 100;
|
||||
displayName: 'Diff Size Check'
|
||||
- job: "style_check"
|
||||
pool:
|
||||
vmImage: "Ubuntu 18.04"
|
||||
steps:
|
||||
- task: UsePythonVersion@0
|
||||
inputs:
|
||||
versionSpec: 3.7
|
||||
- bash: |
|
||||
pip install flake8
|
||||
python setup.py style
|
||||
displayName: 'flake8 check'
|
||||
- job: "build_docs"
|
||||
pool:
|
||||
vmImage: 'Ubuntu 18.04'
|
||||
steps:
|
||||
- task: UsePythonVersion@0
|
||||
inputs:
|
||||
versionSpec: 3.8
|
||||
- script: |
|
||||
cd doc
|
||||
python -m pip install -r requirements.txt
|
||||
make html SPHINXOPTS='-W -v'
|
||||
displayName: "Build docs"
|
||||
|
||||
- stage: build
|
||||
dependsOn: []
|
||||
jobs:
|
||||
- job: "build_wheel"
|
||||
pool:
|
||||
vmImage: 'Ubuntu 18.04'
|
||||
steps:
|
||||
- task: UsePythonVersion@0
|
||||
inputs:
|
||||
versionSpec: 3.8
|
||||
- script: |
|
||||
python -m pip install setuptools wheel
|
||||
python setup.py bdist_wheel --universal
|
||||
displayName: "Build Python Wheel"
|
||||
continueOnError: false
|
||||
- publish: dist
|
||||
artifact: wheel
|
||||
|
||||
- stage: test
|
||||
displayName: "Test Suite"
|
||||
dependsOn: build
|
||||
jobs:
|
||||
- template: azure-test-template.yml
|
||||
parameters:
|
||||
name: linux
|
||||
vmImage: 'Ubuntu 18.04'
|
||||
- template: azure-test-template.yml
|
||||
parameters:
|
||||
name: windows
|
||||
vmImage: 'windows-2019'
|
||||
- template: azure-test-template.yml
|
||||
parameters:
|
||||
name: macOS
|
||||
vmImage: 'macOS-10.15'
|
@ -1,216 +0,0 @@
|
||||
# Azure Pipelines CI job template for PyDM Tests
|
||||
# https://docs.microsoft.com/en-us/azure/devops/pipelines/languages/anaconda?view=azure-devops
|
||||
parameters:
|
||||
name: ''
|
||||
vmImage: ''
|
||||
|
||||
jobs:
|
||||
- job: ${{ parameters.name }}
|
||||
pool:
|
||||
vmImage: ${{ parameters.vmImage }}
|
||||
strategy:
|
||||
matrix:
|
||||
Python27-PyQt4-4.8:
|
||||
python.version: '2.7'
|
||||
qt.bindings: "pyqt=4"
|
||||
install.method: "conda"
|
||||
Python27-PySide-4.8:
|
||||
python.version: '2.7'
|
||||
qt.bindings: "pyside"
|
||||
install.method: "conda"
|
||||
Python36-PyQt5-5.9:
|
||||
python.version: "3.6"
|
||||
qt.bindings: "pyqt"
|
||||
install.method: "conda"
|
||||
Python37-PySide2-5.13:
|
||||
python.version: "3.7"
|
||||
qt.bindings: "pyside2"
|
||||
install.method: "conda"
|
||||
Python38-PyQt5-Latest:
|
||||
python.version: '3.8'
|
||||
qt.bindings: "PyQt5"
|
||||
install.method: "pip"
|
||||
Python38-PySide2-Latest:
|
||||
python.version: '3.8'
|
||||
qt.bindings: "PySide2"
|
||||
install.method: "pip"
|
||||
|
||||
steps:
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
source: 'current'
|
||||
artifact: wheel
|
||||
path: 'dist'
|
||||
|
||||
- task: ScreenResolutionUtility@1
|
||||
inputs:
|
||||
displaySettings: 'specific'
|
||||
width: '1920'
|
||||
height: '1080'
|
||||
condition: eq(variables['agent.os'], 'Windows_NT' )
|
||||
|
||||
- task: UsePythonVersion@0
|
||||
inputs:
|
||||
versionSpec: $(python.version)
|
||||
condition: eq(variables['install.method'], 'pip')
|
||||
|
||||
- script: |
|
||||
curl -LJO https://github.com/pal1000/mesa-dist-win/releases/download/19.1.0/mesa3d-19.1.0-release-msvc.exe
|
||||
7z x mesa3d-19.1.0-release-msvc.exe
|
||||
cd x64
|
||||
xcopy opengl32.dll C:\windows\system32\mesadrv.dll*
|
||||
xcopy opengl32.dll C:\windows\syswow64\mesadrv.dll*
|
||||
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v DLL /t REG_SZ /d "mesadrv.dll" /f
|
||||
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v DriverVersion /t REG_DWORD /d 1 /f
|
||||
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v Flags /t REG_DWORD /d 1 /f
|
||||
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v Version /t REG_DWORD /d 2 /f
|
||||
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v DLL /t REG_SZ /d "mesadrv.dll" /f
|
||||
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v DriverVersion /t REG_DWORD /d 1 /f
|
||||
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v Flags /t REG_DWORD /d 1 /f
|
||||
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v Version /t REG_DWORD /d 2 /f
|
||||
displayName: "Install Windows-Mesa OpenGL DLL"
|
||||
condition: eq(variables['agent.os'], 'Windows_NT')
|
||||
|
||||
- bash: |
|
||||
if [ $(agent.os) == 'Linux' ]
|
||||
then
|
||||
echo "##vso[task.prependpath]$CONDA/bin"
|
||||
elif [ $(agent.os) == 'Darwin' ]
|
||||
then
|
||||
sudo chown -R $USER $CONDA
|
||||
echo "##vso[task.prependpath]$CONDA/bin"
|
||||
elif [ $(agent.os) == 'Windows_NT' ]
|
||||
then
|
||||
echo "##vso[task.prependpath]$CONDA/Scripts"
|
||||
else
|
||||
echo 'Just what OS are you using?'
|
||||
fi
|
||||
displayName: 'Add Conda To $PATH'
|
||||
condition: eq(variables['install.method'], 'conda' )
|
||||
continueOnError: false
|
||||
|
||||
- bash: |
|
||||
if [ $(install.method) == "conda" ]
|
||||
then
|
||||
conda update --all --yes --quiet
|
||||
conda config --env --set always_yes true
|
||||
if [ $(python.version) == '2.7' ]
|
||||
then
|
||||
conda config --set restore_free_channel true
|
||||
fi
|
||||
if [ $(qt.bindings) == "pyside2" ] || ([ $(qt.bindings) == 'pyside' ] && [ $(agent.os) == 'Darwin' ])
|
||||
then
|
||||
conda config --prepend channels conda-forge
|
||||
fi
|
||||
conda create --name test-environment-$(python.version) python=$(python.version) --yes --quiet
|
||||
source activate test-environment-$(python.version)
|
||||
conda info
|
||||
|
||||
if [ $(qt.bindings) == "pyside2" ]
|
||||
then
|
||||
conda install $(qt.bindings) --yes --quiet --strict-channel-priority
|
||||
else
|
||||
conda install $(qt.bindings) --yes --quiet
|
||||
fi
|
||||
conda install numpy scipy pyopengl h5py six --yes --quiet
|
||||
pip install matplotlib
|
||||
else
|
||||
pip install $(qt.bindings) numpy scipy pyopengl h5py six matplotlib
|
||||
fi
|
||||
pip install pytest pytest-cov coverage pytest-xdist
|
||||
if [ $(python.version) == "2.7" ]
|
||||
then
|
||||
pip install pytest-faulthandler==1.6.0
|
||||
export PYTEST_ADDOPTS="--faulthandler-timeout=15"
|
||||
else
|
||||
pip install pytest pytest-cov coverage
|
||||
fi
|
||||
displayName: "Install Dependencies"
|
||||
|
||||
- bash: |
|
||||
if [ $(install.method) == "conda" ]
|
||||
then
|
||||
source activate test-environment-$(python.version)
|
||||
fi
|
||||
python -m pip install --no-index --find-links=dist pyqtgraph
|
||||
displayName: 'Install Wheel'
|
||||
|
||||
- bash: |
|
||||
sudo apt-get install -y libxkbcommon-x11-dev
|
||||
# workaround for QTBUG-84489
|
||||
sudo apt-get install -y libxcb-xfixes0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xinerama0
|
||||
if [ $(install.method) == "conda" ]
|
||||
then
|
||||
source activate test-environment-$(python.version)
|
||||
fi
|
||||
if [ $(python.version) == "2.7" ]
|
||||
then
|
||||
pip install PyVirtualDisplay==0.2.5 pytest-xvfb==1.2.0
|
||||
else
|
||||
pip install pytest-xvfb
|
||||
fi
|
||||
displayName: "Virtual Display Setup"
|
||||
condition: eq(variables['agent.os'], 'Linux' )
|
||||
|
||||
- bash: |
|
||||
export QT_DEBUG_PLUGINS=1
|
||||
if [ $(install.method) == "conda" ]
|
||||
then
|
||||
source activate test-environment-$(python.version)
|
||||
fi
|
||||
echo python location: `which python`
|
||||
echo python version: `python --version`
|
||||
echo pytest location: `which pytest`
|
||||
echo installed packages
|
||||
pip list
|
||||
echo pyqtgraph system info
|
||||
python -c "import pyqtgraph as pg; pg.systemInfo()"
|
||||
echo display information
|
||||
if [ $(agent.os) == 'Linux' ]
|
||||
then
|
||||
export DISPLAY=:99.0
|
||||
Xvfb :99 -screen 0 1920x1200x24 -ac +extension GLX +render -noreset &
|
||||
sleep 3
|
||||
fi
|
||||
python -m pyqtgraph.util.get_resolution
|
||||
echo openGL information
|
||||
python -c "from pyqtgraph.opengl.glInfo import GLTest"
|
||||
displayName: 'Debug Info'
|
||||
continueOnError: false
|
||||
|
||||
- bash: |
|
||||
if [ $(install.method) == "conda" ]
|
||||
then
|
||||
source activate test-environment-$(python.version)
|
||||
fi
|
||||
mkdir -p "$SCREENSHOT_DIR"
|
||||
# echo "If Screenshots are generated, they may be downloaded from:"
|
||||
# echo "https://dev.azure.com/pyqtgraph/pyqtgraph/_apis/build/builds/$(Build.BuildId)/artifacts?artifactName=Screenshots&api-version=5.0"
|
||||
pytest . -v \
|
||||
-n 1 \
|
||||
--junitxml=junit/test-results.xml \
|
||||
--cov pyqtgraph --cov-report=xml --cov-report=html
|
||||
displayName: 'Unit tests'
|
||||
env:
|
||||
AZURE: 1
|
||||
SCREENSHOT_DIR: $(Build.ArtifactStagingDirectory)/screenshots
|
||||
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: 'Publish Screenshots'
|
||||
condition: failed()
|
||||
inputs:
|
||||
pathtoPublish: $(Build.ArtifactStagingDirectory)/screenshots
|
||||
artifactName: Screenshots
|
||||
|
||||
- task: PublishTestResults@2
|
||||
condition: succeededOrFailed()
|
||||
inputs:
|
||||
testResultsFiles: '**/test-*.xml'
|
||||
testRunTitle: 'Test Results for $(agent.os) - $(python.version) - $(qt.bindings) - $(install.method)'
|
||||
publishRunAttachments: true
|
||||
|
||||
- task: PublishCodeCoverageResults@1
|
||||
inputs:
|
||||
codeCoverageTool: Cobertura
|
||||
summaryFileLocation: '$(System.DefaultWorkingDirectory)/**/coverage.xml'
|
||||
reportDirectory: '$(System.DefaultWorkingDirectory)/**/htmlcov'
|
1
benchmarks/__init__.py
Normal file
1
benchmarks/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
|
72
benchmarks/makeARGB.py
Normal file
72
benchmarks/makeARGB.py
Normal file
@ -0,0 +1,72 @@
|
||||
import numpy as np
|
||||
|
||||
from pyqtgraph.functions import makeARGB
|
||||
|
||||
|
||||
class TimeSuite(object):
|
||||
def __init__(self):
|
||||
self.c_map = None
|
||||
self.float_data = None
|
||||
self.uint8_data = None
|
||||
self.uint8_lut = None
|
||||
self.uint16_data = None
|
||||
self.uint16_lut = None
|
||||
|
||||
def setup(self):
|
||||
size = (500, 500)
|
||||
|
||||
self.float_data = {
|
||||
'data': np.random.normal(size=size),
|
||||
'levels': [-4., 4.],
|
||||
}
|
||||
|
||||
self.uint16_data = {
|
||||
'data': np.random.randint(100, 4500, size=size).astype('uint16'),
|
||||
'levels': [250, 3000],
|
||||
}
|
||||
|
||||
self.uint8_data = {
|
||||
'data': np.random.randint(0, 255, size=size).astype('ubyte'),
|
||||
'levels': [20, 220],
|
||||
}
|
||||
|
||||
self.c_map = np.array([
|
||||
[-500., 255.],
|
||||
[-255., 255.],
|
||||
[0., 500.],
|
||||
])
|
||||
|
||||
self.uint8_lut = np.zeros((256, 4), dtype='ubyte')
|
||||
for i in range(3):
|
||||
self.uint8_lut[:, i] = np.clip(np.linspace(self.c_map[i][0], self.c_map[i][1], 256), 0, 255)
|
||||
self.uint8_lut[:, 3] = 255
|
||||
|
||||
self.uint16_lut = np.zeros((2 ** 16, 4), dtype='ubyte')
|
||||
for i in range(3):
|
||||
self.uint16_lut[:, i] = np.clip(np.linspace(self.c_map[i][0], self.c_map[i][1], 2 ** 16), 0, 255)
|
||||
self.uint16_lut[:, 3] = 255
|
||||
|
||||
|
||||
def make_test(dtype, use_levels, lut_name, func_name):
|
||||
def time_test(self):
|
||||
data = getattr(self, dtype + '_data')
|
||||
makeARGB(
|
||||
data['data'],
|
||||
lut=getattr(self, lut_name + '_lut', None),
|
||||
levels=use_levels and data['levels'],
|
||||
)
|
||||
|
||||
time_test.__name__ = func_name
|
||||
return time_test
|
||||
|
||||
|
||||
for dt in ['float', 'uint16', 'uint8']:
|
||||
for levels in [True, False]:
|
||||
for ln in [None, 'uint8', 'uint16']:
|
||||
name = f'time_makeARGB_{dt}_{"" if levels else "no"}levels_{ln or "no"}lut'
|
||||
setattr(TimeSuite, name, make_test(dt, levels, ln, name))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
ts = TimeSuite()
|
||||
ts.setup()
|
@ -12,7 +12,7 @@ Contents:
|
||||
widgets/index
|
||||
3dgraphics/index
|
||||
colormap
|
||||
parametertree/index
|
||||
parametertree/apiref
|
||||
dockarea
|
||||
graphicsscene/index
|
||||
flowchart/index
|
||||
|
@ -30,6 +30,8 @@ useWeave bool False Use weave to speed up
|
||||
weaveDebug bool False Print full error message if weave compile fails.
|
||||
useOpenGL bool False Enable OpenGL in GraphicsView. This can have unpredictable effects on stability
|
||||
and performance.
|
||||
useCupy bool False Use cupy to perform calculations on the GPU. Only currently applies to
|
||||
ImageItem and its associated functions.
|
||||
enableExperimental bool False Enable experimental features (the curious can search for this key in the code).
|
||||
crashWarning bool False If True, print warnings about situations that may result in a crash.
|
||||
================== =================== ================== ================================================================================
|
||||
|
@ -51,7 +51,29 @@ For the serious application developer, all of the functionality in pyqtgraph is
|
||||
#. Under "Header file", enter "pyqtgraph".
|
||||
#. Click "Add", then click "Promote".
|
||||
|
||||
See the designer documentation for more information on promoting widgets. The "VideoSpeedTest" and "ScatterPlotSpeedTest" examples both demonstrate the use of .ui files that are compiled to .py modules using pyuic4 or pyside-uic. The "designerExample" example demonstrates dynamically generating python classes from .ui files (no pyuic4 / pyside-uic needed).
|
||||
See the designer documentation for more information on promoting widgets. The "VideoSpeedTest" and "ScatterPlotSpeedTest" examples both demonstrate the use of .ui files that are compiled to .py modules using pyuic5 or pyside-uic. The "designerExample" example demonstrates dynamically generating python classes from .ui files (no pyuic5 / pyside-uic needed).
|
||||
|
||||
|
||||
HiDPI Displays
|
||||
--------------
|
||||
|
||||
PyQtGraph has a method :func:`mkQApp <pyqtgraph.Qt.mkQApp>` that by default sets what we have tested to be the best combination of options to support hidpi displays, when in combination with non-hidpi secondary displays. For your application, you may have instantiated ``QApplication`` yourself, in which case we advise setting these options *before* runing ``QApplication.exec_()``.
|
||||
|
||||
For Qt6 bindings, this functionally "just works" without having to set any attributes.
|
||||
|
||||
On Versions of Qt >= 5.14 and < 6; you can get ideal behavior with the following lines::
|
||||
|
||||
os.environ["QT_ENABLE_HIDPI_SCALING"] = "1"
|
||||
QApplication.setHighDpiScaleFactorRoundingPolicy(QtCore.Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
|
||||
|
||||
If you are on Qt >= 5.6 and < 5.14; you can get near ideal behavior with the following lines::
|
||||
|
||||
QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
|
||||
QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps)
|
||||
|
||||
With the later, ideal behavior was not achieved.
|
||||
|
||||
.. autofunction:: pyqtgraph.Qt.mkQApp
|
||||
|
||||
|
||||
PyQt and PySide
|
||||
@ -61,15 +83,16 @@ PyQtGraph supports two popular python wrappers for the Qt library: PyQt and PySi
|
||||
APIs and functionality, but for various reasons (discussed elsewhere) you may prefer to use one package or the other. When
|
||||
pyqtgraph is first imported, it automatically determines which library to use by making the fillowing checks:
|
||||
|
||||
#. If PyQt4 is already imported, use that
|
||||
#. Else, if PySide is already imported, use that
|
||||
#. Else, attempt to import PyQt4
|
||||
#. If that import fails, attempt to import PySide.
|
||||
#. If PyQt5 is already imported, use that
|
||||
#. Else, if PySide2 is already imported, use that
|
||||
#. Else, if PySide6 is already imported, use that
|
||||
#. Else, if PyQt6 is already imported, use that
|
||||
#. Else, attempt to import PyQt5, PySide2, PySide6, PyQt6, in that order.
|
||||
|
||||
If you have both libraries installed on your system and you wish to force pyqtgraph to use one or the other, simply
|
||||
make sure it is imported before pyqtgraph::
|
||||
|
||||
import PySide ## this will force pyqtgraph to use PySide instead of PyQt4
|
||||
import PySide2 ## this will force pyqtgraph to use PySide2 instead of PyQt5
|
||||
import pyqtgraph as pg
|
||||
|
||||
|
||||
|
@ -3,8 +3,8 @@ Installation
|
||||
|
||||
PyQtGraph depends on:
|
||||
|
||||
* Python 2.7 or Python 3.x
|
||||
* A Qt library such as PyQt4, PyQt5, PySide, or PySide2
|
||||
* Python 3.7+
|
||||
* A Qt library such as PyQt5, or PySide2
|
||||
* numpy
|
||||
|
||||
The easiest way to meet these dependencies is with ``pip`` or with a scientific
|
||||
|
@ -3,17 +3,22 @@
|
||||
Parameter Trees
|
||||
===============
|
||||
|
||||
.. currentmodule:: pyqtgraph.parametertree
|
||||
|
||||
Parameter trees are a system for handling hierarchies of parameters while automatically generating one or more GUIs to display and interact with the parameters.
|
||||
This feature is commonly seen, for example, in user interface design applications which display a list of editable properties for each widget.
|
||||
Parameters generally have a name, a data type (int, float, string, color, etc), and a value matching the data type. Parameters may be grouped and nested
|
||||
to form hierarchies and may be subclassed to provide custom behavior and display widgets.
|
||||
Parameters generally have a name, a data type (int, float, string, color, etc), and a value matching the data type. Parameters may be grouped and nested to form hierarchies and may be subclassed to provide custom behavior and display widgets.
|
||||
|
||||
PyQtGraph's parameter tree system works similarly to the model-view architecture used by some components of Qt: Parameters are purely data-handling classes
|
||||
that exist independent of any graphical interface. A ParameterTree is a widget that automatically generates a graphical interface which represents
|
||||
the state of a haierarchy of Parameter objects and allows the user to edit the values within that hierarchy. This separation of data (model) and graphical
|
||||
interface (view) allows the same data to be represented multiple times and in a variety of different ways.
|
||||
PyQtGraph's parameter tree system works similarly to the model-view architecture used by some components of Qt:
|
||||
|
||||
For more information, see the 'parametertree' example included with pyqtgraph and the API reference
|
||||
- A :class:`Parameter` is a purely data-handling class that exists independent of any graphical interface.
|
||||
- A :class:`ParameterItem` is an interactive graphical representation of a :class:`Parameter`.
|
||||
- A :class:`ParameterTree` is a widget that automatically generates a graphical interface which represents the state of a hierarchy of Parameter objects and allows the user to edit the values within that hierarchy.
|
||||
|
||||
This separation of data (model) and graphical interface (view) allows the same data to be represented multiple times and in a variety of different ways.
|
||||
For example, a floating point number parameter could be represented by a slider or a spinbox, or both.
|
||||
|
||||
For more information, see the 'parametertree' example included with pyqtgraph and the API reference:
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
@ -1,8 +1,9 @@
|
||||
Parameter
|
||||
=========
|
||||
|
||||
.. autofunction:: pyqtgraph.parametertree.registerParameterType
|
||||
|
||||
.. autoclass:: pyqtgraph.parametertree.Parameter
|
||||
:members:
|
||||
|
||||
.. automethod:: pyqtgraph.parametertree.Parameter.__init__
|
||||
|
||||
|
@ -1,6 +1,40 @@
|
||||
Built-in Parameter Types
|
||||
========================
|
||||
|
||||
.. automodule:: pyqtgraph.parametertree.parameterTypes
|
||||
:members:
|
||||
.. currentmodule:: pyqtgraph.parametertree.parameterTypes
|
||||
|
||||
Parameters
|
||||
----------
|
||||
|
||||
.. autoclass:: SimpleParameter
|
||||
:members:
|
||||
|
||||
.. autoclass:: GroupParameter
|
||||
:members:
|
||||
|
||||
.. autoclass:: ListParameter
|
||||
:members:
|
||||
|
||||
.. autoclass:: TextParameter
|
||||
:members:
|
||||
|
||||
.. autoclass:: ActionParameter
|
||||
:members:
|
||||
|
||||
ParameterItems
|
||||
--------------
|
||||
|
||||
.. autoclass:: WidgetParameterItem
|
||||
:members:
|
||||
|
||||
.. autoclass:: GroupParameterItem
|
||||
:members:
|
||||
|
||||
.. autoclass:: ListParameterItem
|
||||
:members:
|
||||
|
||||
.. autoclass:: TextParameterItem
|
||||
:members:
|
||||
|
||||
.. autoclass:: ActionParameterItem
|
||||
:members:
|
||||
|
@ -17,7 +17,7 @@ PyQtGraph fits into this scheme by providing its own QWidget subclasses to be in
|
||||
|
||||
Example::
|
||||
|
||||
from PyQt4 import QtGui # (the example applies equally well to PySide)
|
||||
from PyQt5 import QtGui # (the example applies equally well to PySide2)
|
||||
import pyqtgraph as pg
|
||||
|
||||
## Always start by initializing Qt (only once per application)
|
||||
@ -99,4 +99,3 @@ QTimer, Multi-Threading
|
||||
|
||||
Multi-threading vs Multi-processing in Qt
|
||||
-----------------------------------------
|
||||
|
||||
|
@ -15,7 +15,7 @@ from pyqtgraph.Qt import QtGui, QtCore
|
||||
import pyqtgraph as pg
|
||||
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Arrow Example")
|
||||
|
||||
w = QtGui.QMainWindow()
|
||||
cw = pg.GraphicsLayoutWidget()
|
||||
|
@ -11,7 +11,7 @@ import pyqtgraph as pg
|
||||
from pyqtgraph.Qt import QtCore, QtGui
|
||||
import numpy as np
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("ColorButton Example")
|
||||
win = QtGui.QMainWindow()
|
||||
btn = pg.ColorButton()
|
||||
win.setCentralWidget(btn)
|
||||
|
@ -14,7 +14,7 @@ import numpy as np
|
||||
from pyqtgraph.Qt import QtCore, QtGui
|
||||
import pyqtgraph as pg
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Data Slicing Example")
|
||||
|
||||
## Create window with two ImageView widgets
|
||||
win = QtGui.QMainWindow()
|
||||
|
@ -22,7 +22,7 @@ def some_func2():
|
||||
return sys.exc_info()[2]
|
||||
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("DataTreeWidget Example")
|
||||
d = {
|
||||
'a list': [1,2,3,4,5,6, {'nested1': 'aaaaa', 'nested2': 'bbbbb'}, "seven"],
|
||||
'a dict': {
|
||||
|
@ -12,7 +12,7 @@ import numpy as np
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph.Qt import QtGui
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("DateAxisItem Example")
|
||||
|
||||
# Create a plot with a date-time axis
|
||||
w = pg.PlotWidget(axisItems = {'bottom': pg.DateAxisItem()})
|
||||
|
@ -9,17 +9,20 @@ import initExample ## Add path to library (just for examples; you do not need th
|
||||
|
||||
import sys
|
||||
import time
|
||||
import os
|
||||
|
||||
import numpy as np
|
||||
from PyQt5 import QtWidgets, QtCore, uic
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph.Qt import QtWidgets, QtCore, loadUiType
|
||||
|
||||
pg.setConfigOption('background', 'w')
|
||||
pg.setConfigOption('foreground', 'k')
|
||||
|
||||
BLUE = pg.mkPen('#1f77b4')
|
||||
|
||||
Design, _ = uic.loadUiType('DateAxisItem_QtDesigner.ui')
|
||||
path = os.path.dirname(os.path.abspath(__file__))
|
||||
uiFile = os.path.join(path, 'DateAxisItem_QtDesigner.ui')
|
||||
Design, _ = loadUiType(uiFile)
|
||||
|
||||
class ExampleApp(QtWidgets.QMainWindow, Design):
|
||||
def __init__(self):
|
||||
@ -34,9 +37,7 @@ class ExampleApp(QtWidgets.QMainWindow, Design):
|
||||
self.plotWidget.setAxisItems({'bottom': pg.DateAxisItem()})
|
||||
self.plotWidget.showGrid(x=True, y=True)
|
||||
|
||||
app = QtWidgets.QApplication(sys.argv)
|
||||
app.setStyle(QtWidgets.QStyleFactory.create('Fusion'))
|
||||
app.setPalette(QtWidgets.QApplication.style().standardPalette())
|
||||
app = pg.mkQApp("DateAxisItem_QtDesigner Example")
|
||||
window = ExampleApp()
|
||||
window.setWindowTitle('pyqtgraph example: DateAxisItem_QtDesigner')
|
||||
window.show()
|
||||
|
@ -12,7 +12,7 @@ from pyqtgraph.Qt import QtCore, QtGui
|
||||
import numpy as np
|
||||
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("DiffTreeWidget Example")
|
||||
A = {
|
||||
'a list': [1,2,2,4,5,6, {'nested1': 'aaaa', 'nested2': 'bbbbb'}, "seven"],
|
||||
'a dict': {
|
||||
|
@ -12,7 +12,7 @@ from pyqtgraph.Qt import QtCore, QtGui
|
||||
import numpy as np
|
||||
import pyqtgraph as pg
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Draw Example")
|
||||
|
||||
## Create window with GraphicsView widget
|
||||
w = pg.GraphicsView()
|
||||
|
@ -1,110 +1,26 @@
|
||||
import keyword
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import subprocess
|
||||
from argparse import Namespace
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph.python2_3 import basestring
|
||||
from pyqtgraph.Qt import QtGui, QtCore, QT_LIB
|
||||
from pyqtgraph.pgcollections import OrderedDict
|
||||
from .utils import examples
|
||||
|
||||
path = os.path.abspath(os.path.dirname(__file__))
|
||||
sys.path.insert(0, path)
|
||||
app = pg.mkQApp()
|
||||
|
||||
if QT_LIB == 'PySide':
|
||||
from exampleLoaderTemplate_pyside import Ui_Form
|
||||
elif QT_LIB == 'PySide2':
|
||||
from exampleLoaderTemplate_pyside2 import Ui_Form
|
||||
elif QT_LIB == 'PyQt5':
|
||||
from exampleLoaderTemplate_pyqt5 import Ui_Form
|
||||
else:
|
||||
from exampleLoaderTemplate_pyqt import Ui_Form
|
||||
|
||||
examples = OrderedDict([
|
||||
('Command-line usage', 'CLIexample.py'),
|
||||
('Basic Plotting', 'Plotting.py'),
|
||||
('ImageView', 'ImageView.py'),
|
||||
('ParameterTree', 'parametertree.py'),
|
||||
('Crosshair / Mouse interaction', 'crosshair.py'),
|
||||
('Data Slicing', 'DataSlicing.py'),
|
||||
('Plot Customization', 'customPlot.py'),
|
||||
('Timestamps on x axis', 'DateAxisItem.py'),
|
||||
('Image Analysis', 'imageAnalysis.py'),
|
||||
('ViewBox Features', 'ViewBoxFeatures.py'),
|
||||
('Dock widgets', 'dockarea.py'),
|
||||
('Console', 'ConsoleWidget.py'),
|
||||
('Histograms', 'histogram.py'),
|
||||
('Beeswarm plot', 'beeswarm.py'),
|
||||
('Symbols', 'Symbols.py'),
|
||||
('Auto-range', 'PlotAutoRange.py'),
|
||||
('Remote Plotting', 'RemoteSpeedTest.py'),
|
||||
('Scrolling plots', 'scrollingPlots.py'),
|
||||
('HDF5 big data', 'hdf5.py'),
|
||||
('Demos', OrderedDict([
|
||||
('Optics', 'optics_demos.py'),
|
||||
('Special relativity', 'relativity_demo.py'),
|
||||
('Verlet chain', 'verlet_chain_demo.py'),
|
||||
('Koch Fractal', 'fractal.py'),
|
||||
])),
|
||||
('GraphicsItems', OrderedDict([
|
||||
('Scatter Plot', 'ScatterPlot.py'),
|
||||
#('PlotItem', 'PlotItem.py'),
|
||||
('IsocurveItem', 'isocurve.py'),
|
||||
('GraphItem', 'GraphItem.py'),
|
||||
('ErrorBarItem', 'ErrorBarItem.py'),
|
||||
('FillBetweenItem', 'FillBetweenItem.py'),
|
||||
('ImageItem - video', 'ImageItem.py'),
|
||||
('ImageItem - draw', 'Draw.py'),
|
||||
('Region-of-Interest', 'ROIExamples.py'),
|
||||
('Bar Graph', 'BarGraphItem.py'),
|
||||
('GraphicsLayout', 'GraphicsLayout.py'),
|
||||
('LegendItem', 'Legend.py'),
|
||||
('Text Item', 'text.py'),
|
||||
('Linked Views', 'linkedViews.py'),
|
||||
('Arrow', 'Arrow.py'),
|
||||
('ViewBox', 'ViewBoxFeatures.py'),
|
||||
('Custom Graphics', 'customGraphicsItem.py'),
|
||||
('Labeled Graph', 'CustomGraphItem.py'),
|
||||
])),
|
||||
('Benchmarks', OrderedDict([
|
||||
('Video speed test', 'VideoSpeedTest.py'),
|
||||
('Line Plot update', 'PlotSpeedTest.py'),
|
||||
('Scatter Plot update', 'ScatterPlotSpeedTest.py'),
|
||||
('Multiple plots', 'MultiPlotSpeedTest.py'),
|
||||
])),
|
||||
('3D Graphics', OrderedDict([
|
||||
('Volumetric', 'GLVolumeItem.py'),
|
||||
('Isosurface', 'GLIsosurface.py'),
|
||||
('Surface Plot', 'GLSurfacePlot.py'),
|
||||
('Scatter Plot', 'GLScatterPlotItem.py'),
|
||||
('Shaders', 'GLshaders.py'),
|
||||
('Line Plot', 'GLLinePlotItem.py'),
|
||||
('Mesh', 'GLMeshItem.py'),
|
||||
('Image', 'GLImageItem.py'),
|
||||
])),
|
||||
('Widgets', OrderedDict([
|
||||
('PlotWidget', 'PlotWidget.py'),
|
||||
('SpinBox', 'SpinBox.py'),
|
||||
('ConsoleWidget', 'ConsoleWidget.py'),
|
||||
('Histogram / lookup table', 'HistogramLUT.py'),
|
||||
('TreeWidget', 'TreeWidget.py'),
|
||||
('ScatterPlotWidget', 'ScatterPlotWidget.py'),
|
||||
('DataTreeWidget', 'DataTreeWidget.py'),
|
||||
('GradientWidget', 'GradientWidget.py'),
|
||||
('TableWidget', 'TableWidget.py'),
|
||||
('ColorButton', 'ColorButton.py'),
|
||||
#('CheckTable', '../widgets/CheckTable.py'),
|
||||
#('VerticalLabel', '../widgets/VerticalLabel.py'),
|
||||
('JoystickButton', 'JoystickButton.py'),
|
||||
])),
|
||||
('Flowcharts', 'Flowchart.py'),
|
||||
('Custom Flowchart Nodes', 'FlowchartCustomNode.py'),
|
||||
])
|
||||
|
||||
import importlib
|
||||
ui_template = importlib.import_module(
|
||||
f'exampleLoaderTemplate_{QT_LIB.lower()}')
|
||||
|
||||
|
||||
# based on https://github.com/art1415926535/PyQt5-syntax-highlighting
|
||||
|
||||
QRegExp = QtCore.QRegExp
|
||||
QRegularExpression = QtCore.QRegularExpression
|
||||
|
||||
QFont = QtGui.QFont
|
||||
QColor = QtGui.QColor
|
||||
@ -208,55 +124,45 @@ class PythonHighlighter(QSyntaxHighlighter):
|
||||
"""Syntax highlighter for the Python language.
|
||||
"""
|
||||
# Python keywords
|
||||
keywords = [
|
||||
'and', 'assert', 'break', 'class', 'continue', 'def',
|
||||
'del', 'elif', 'else', 'except', 'exec', 'finally',
|
||||
'for', 'from', 'global', 'if', 'import', 'in',
|
||||
'is', 'lambda', 'not', 'or', 'pass', 'print',
|
||||
'raise', 'return', 'try', 'while', 'yield',
|
||||
'None', 'True', 'False', 'async', 'await',
|
||||
]
|
||||
keywords = keyword.kwlist
|
||||
|
||||
# Python operators
|
||||
operators = [
|
||||
'=',
|
||||
r'=',
|
||||
# Comparison
|
||||
'==', '!=', '<', '<=', '>', '>=',
|
||||
r'==', r'!=', r'<', r'<=', r'>', r'>=',
|
||||
# Arithmetic
|
||||
'\+', '-', '\*', '/', '//', '\%', '\*\*',
|
||||
r'\+', r"-", r'\*', r'/', r'//', r'%', r'\*\*',
|
||||
# In-place
|
||||
'\+=', '-=', '\*=', '/=', '\%=',
|
||||
r'\+=', r'-=', r'\*=', r'/=', r'\%=',
|
||||
# Bitwise
|
||||
'\^', '\|', '\&', '\~', '>>', '<<',
|
||||
r'\^', r'\|', r'&', r'~', r'>>', r'<<',
|
||||
]
|
||||
|
||||
# Python braces
|
||||
braces = [
|
||||
'\{', '\}', '\(', '\)', '\[', '\]',
|
||||
r'\{', r'\}', r'\(', r'\)', r'\[', r'\]',
|
||||
]
|
||||
|
||||
def __init__(self, document):
|
||||
QSyntaxHighlighter.__init__(self, document)
|
||||
|
||||
# Multi-line strings (expression, flag, style)
|
||||
# FIXME: The triple-quotes in these two lines will mess up the
|
||||
# syntax highlighting from this point onward
|
||||
self.tri_single = (QRegExp("'''"), 1, 'string2')
|
||||
self.tri_double = (QRegExp('"""'), 2, 'string2')
|
||||
self.tri_single = (QRegularExpression("'''"), 1, 'string2')
|
||||
self.tri_double = (QRegularExpression('"""'), 2, 'string2')
|
||||
|
||||
rules = []
|
||||
|
||||
# Keyword, operator, and brace rules
|
||||
rules += [(r'\b%s\b' % w, 0, 'keyword')
|
||||
for w in PythonHighlighter.keywords]
|
||||
rules += [(r'%s' % o, 0, 'operator')
|
||||
rules += [(o, 0, 'operator')
|
||||
for o in PythonHighlighter.operators]
|
||||
rules += [(r'%s' % b, 0, 'brace')
|
||||
rules += [(b, 0, 'brace')
|
||||
for b in PythonHighlighter.braces]
|
||||
|
||||
# All other rules
|
||||
rules += [
|
||||
|
||||
# 'self'
|
||||
(r'\bself\b', 0, 'self'),
|
||||
|
||||
@ -277,12 +183,8 @@ class PythonHighlighter(QSyntaxHighlighter):
|
||||
|
||||
# From '#' until a newline
|
||||
(r'#[^\n]*', 0, 'comment'),
|
||||
|
||||
]
|
||||
|
||||
# Build a QRegExp for each pattern
|
||||
self.rules = [(QRegExp(pat), index, fmt)
|
||||
for (pat, index, fmt) in rules]
|
||||
self.rules = rules
|
||||
|
||||
@property
|
||||
def styles(self):
|
||||
@ -294,16 +196,14 @@ class PythonHighlighter(QSyntaxHighlighter):
|
||||
"""
|
||||
# Do other syntax formatting
|
||||
for expression, nth, format in self.rules:
|
||||
index = expression.indexIn(text, 0)
|
||||
format = self.styles[format]
|
||||
|
||||
while index >= 0:
|
||||
# We actually want the index of the nth match
|
||||
index = expression.pos(nth)
|
||||
length = len(expression.cap(nth))
|
||||
self.setFormat(index, length, format)
|
||||
index = expression.indexIn(text, index + length)
|
||||
|
||||
for n, match in enumerate(re.finditer(expression, text)):
|
||||
if n < nth:
|
||||
continue
|
||||
start = match.start()
|
||||
length = match.end() - start
|
||||
self.setFormat(start, length, format)
|
||||
self.setCurrentBlockState(0)
|
||||
|
||||
# Do multi-line strings
|
||||
@ -312,11 +212,16 @@ class PythonHighlighter(QSyntaxHighlighter):
|
||||
in_multiline = self.match_multiline(text, *self.tri_double)
|
||||
|
||||
def match_multiline(self, text, delimiter, in_state, style):
|
||||
"""Do highlighting of multi-line strings. ``delimiter`` should be a
|
||||
``QRegExp`` for triple-single-quotes or triple-double-quotes, and
|
||||
``in_state`` should be a unique integer to represent the corresponding
|
||||
state changes when inside those strings. Returns True if we're still
|
||||
inside a multi-line string when this function is finished.
|
||||
"""Do highlighting of multi-line strings.
|
||||
|
||||
=========== ==========================================================
|
||||
delimiter (QRegularExpression) for triple-single-quotes or
|
||||
triple-double-quotes
|
||||
in_state (int) to represent the corresponding state changes when
|
||||
inside those strings. Returns True if we're still inside a
|
||||
multi-line string when this function is finished.
|
||||
style (str) representation of the kind of style to use
|
||||
=========== ==========================================================
|
||||
"""
|
||||
# If inside triple-single quotes, start at 0
|
||||
if self.previousBlockState() == in_state:
|
||||
@ -324,17 +229,19 @@ class PythonHighlighter(QSyntaxHighlighter):
|
||||
add = 0
|
||||
# Otherwise, look for the delimiter on this line
|
||||
else:
|
||||
start = delimiter.indexIn(text)
|
||||
match = delimiter.match(text)
|
||||
start = match.capturedStart()
|
||||
# Move past this match
|
||||
add = delimiter.matchedLength()
|
||||
add = match.capturedLength()
|
||||
|
||||
# As long as there's a delimiter match on this line...
|
||||
while start >= 0:
|
||||
# Look for the ending delimiter
|
||||
end = delimiter.indexIn(text, start + add)
|
||||
match = delimiter.match(text, start + add)
|
||||
end = match.capturedEnd()
|
||||
# Ending delimiter on this line?
|
||||
if end >= add:
|
||||
length = end - start + add + delimiter.matchedLength()
|
||||
length = end - start + add + match.capturedLength()
|
||||
self.setCurrentBlockState(0)
|
||||
# No; multi-line string
|
||||
else:
|
||||
@ -343,7 +250,8 @@ class PythonHighlighter(QSyntaxHighlighter):
|
||||
# Apply formatting
|
||||
self.setFormat(start, length, self.styles[style])
|
||||
# Look for the next match
|
||||
start = delimiter.indexIn(text, start + length)
|
||||
match = delimiter.match(text, start + length)
|
||||
start = match.capturedStart()
|
||||
|
||||
# Return True if still inside a multi-line string, False otherwise
|
||||
if self.currentBlockState() == in_state:
|
||||
@ -356,7 +264,7 @@ class PythonHighlighter(QSyntaxHighlighter):
|
||||
class ExampleLoader(QtGui.QMainWindow):
|
||||
def __init__(self):
|
||||
QtGui.QMainWindow.__init__(self)
|
||||
self.ui = Ui_Form()
|
||||
self.ui = ui_template.Ui_Form()
|
||||
self.cw = QtGui.QWidget()
|
||||
self.setCentralWidget(self.cw)
|
||||
self.ui.setupUi(self.cw)
|
||||
@ -366,9 +274,7 @@ class ExampleLoader(QtGui.QMainWindow):
|
||||
self.ui.codeView.setLayout(self.codeLayout)
|
||||
self.hl = PythonHighlighter(self.ui.codeView.document())
|
||||
app = QtGui.QApplication.instance()
|
||||
if QT_LIB in ['PyQt5', 'PySide2']:
|
||||
# Qt4 does not have a paletteChanged signal
|
||||
app.paletteChanged.connect(self.updateTheme)
|
||||
app.paletteChanged.connect(self.updateTheme)
|
||||
self.codeLayout.addItem(QtGui.QSpacerItem(100,100,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding), 0, 0)
|
||||
self.codeLayout.addWidget(self.codeBtn, 1, 1)
|
||||
self.codeBtn.hide()
|
||||
@ -410,15 +316,23 @@ class ExampleLoader(QtGui.QMainWindow):
|
||||
self.hl = PythonHighlighter(self.ui.codeView.document())
|
||||
|
||||
def populateTree(self, root, examples):
|
||||
bold_font = None
|
||||
for key, val in examples.items():
|
||||
item = QtGui.QTreeWidgetItem([key])
|
||||
self.itemCache.append(item) # PyQt 4.9.6 no longer keeps references to these wrappers,
|
||||
# so we need to make an explicit reference or else the .file
|
||||
# attribute will disappear.
|
||||
if isinstance(val, basestring):
|
||||
item.file = val
|
||||
else:
|
||||
if isinstance(val, OrderedDict):
|
||||
self.populateTree(item, val)
|
||||
elif isinstance(val, Namespace):
|
||||
item.file = val.filename
|
||||
if 'recommended' in val:
|
||||
if bold_font is None:
|
||||
bold_font = item.font(0)
|
||||
bold_font.setBold(True)
|
||||
item.setFont(0, bold_font)
|
||||
else:
|
||||
item.file = val
|
||||
root.addChild(item)
|
||||
|
||||
def currentFile(self):
|
||||
|
@ -19,7 +19,7 @@ import pyqtgraph as pg
|
||||
import numpy as np
|
||||
import pyqtgraph.metaarray as metaarray
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Flowchart Example")
|
||||
|
||||
## Create main window with grid layout
|
||||
win = QtGui.QMainWindow()
|
||||
|
@ -13,7 +13,7 @@ from pyqtgraph.Qt import QtGui, QtCore
|
||||
import pyqtgraph as pg
|
||||
import numpy as np
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Flowchart Custom Node Example")
|
||||
|
||||
## Create main window with a grid layout inside
|
||||
win = QtGui.QMainWindow()
|
||||
|
@ -11,7 +11,7 @@ import pyqtgraph.opengl as gl
|
||||
import pyqtgraph as pg
|
||||
import numpy as np
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("GLBarGraphItem Example")
|
||||
w = gl.GLViewWidget()
|
||||
w.opts['distance'] = 40
|
||||
w.show()
|
||||
|
@ -13,7 +13,7 @@ import pyqtgraph.opengl as gl
|
||||
import pyqtgraph as pg
|
||||
import numpy as np
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("GLImageItem Example")
|
||||
w = gl.GLViewWidget()
|
||||
w.opts['distance'] = 200
|
||||
w.show()
|
||||
|
@ -11,7 +11,7 @@ from pyqtgraph.Qt import QtCore, QtGui
|
||||
import pyqtgraph as pg
|
||||
import pyqtgraph.opengl as gl
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("GLIsosurface Example")
|
||||
w = gl.GLViewWidget()
|
||||
w.show()
|
||||
w.setWindowTitle('pyqtgraph example: GLIsosurface')
|
||||
|
@ -11,7 +11,7 @@ import pyqtgraph.opengl as gl
|
||||
import pyqtgraph as pg
|
||||
import numpy as np
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("GLLinePlotItem Example")
|
||||
w = gl.GLViewWidget()
|
||||
w.opts['distance'] = 40
|
||||
w.show()
|
||||
|
@ -11,7 +11,7 @@ from pyqtgraph.Qt import QtCore, QtGui
|
||||
import pyqtgraph as pg
|
||||
import pyqtgraph.opengl as gl
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("GLMeshItem Example")
|
||||
w = gl.GLViewWidget()
|
||||
w.show()
|
||||
w.setWindowTitle('pyqtgraph example: GLMeshItem')
|
||||
|
@ -7,11 +7,12 @@ Demonstrates use of GLScatterPlotItem with rapidly-updating plots.
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph.Qt import QtCore, QtGui
|
||||
import pyqtgraph.opengl as gl
|
||||
import numpy as np
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("GLScatterPlotItem Example")
|
||||
w = gl.GLViewWidget()
|
||||
w.opts['distance'] = 20
|
||||
w.show()
|
||||
|
@ -13,7 +13,7 @@ import pyqtgraph.opengl as gl
|
||||
import numpy as np
|
||||
|
||||
## Create a GL View widget to display data
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("GLSurfacePlot Example")
|
||||
w = gl.GLViewWidget()
|
||||
w.show()
|
||||
w.setWindowTitle('pyqtgraph example: GLSurfacePlot')
|
||||
|
@ -6,10 +6,10 @@ Very basic 3D graphics example; create a view widget and add a few items.
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
from pyqtgraph.Qt import QtCore, QtGui
|
||||
from pyqtgraph.Qt import QtCore, QtGui, mkQApp
|
||||
import pyqtgraph.opengl as gl
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = mkQApp("GLViewWidget Example")
|
||||
w = gl.GLViewWidget()
|
||||
w.opts['distance'] = 20
|
||||
w.show()
|
||||
|
@ -7,10 +7,11 @@ Demonstrates GLVolumeItem for displaying volumetric data.
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph.Qt import QtCore, QtGui
|
||||
import pyqtgraph.opengl as gl
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("GLVolumeItem Example")
|
||||
w = gl.GLViewWidget()
|
||||
w.opts['distance'] = 200
|
||||
w.show()
|
||||
|
@ -13,7 +13,7 @@ from pyqtgraph.Qt import QtCore, QtGui
|
||||
import pyqtgraph as pg
|
||||
import pyqtgraph.opengl as gl
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("GLShaders Example")
|
||||
w = gl.GLViewWidget()
|
||||
w.show()
|
||||
w.setWindowTitle('pyqtgraph example: GL Shaders')
|
||||
|
@ -7,7 +7,7 @@ from pyqtgraph.Qt import QtGui, QtCore
|
||||
import pyqtgraph as pg
|
||||
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Gradiant Editor Example")
|
||||
mw = pg.GraphicsView()
|
||||
mw.resize(800,800)
|
||||
mw.show()
|
||||
|
@ -12,7 +12,7 @@ import numpy as np
|
||||
|
||||
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Gradiant Widget Example")
|
||||
w = QtGui.QMainWindow()
|
||||
w.show()
|
||||
w.setWindowTitle('pyqtgraph example: GradientWidget')
|
||||
|
@ -12,7 +12,7 @@ from pyqtgraph.Qt import QtGui, QtCore
|
||||
import pyqtgraph as pg
|
||||
import numpy as np
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Gradiant Layout Example")
|
||||
view = pg.GraphicsView()
|
||||
l = pg.GraphicsLayout(border=(100,100,100))
|
||||
view.setCentralItem(l)
|
||||
|
@ -6,7 +6,7 @@ from pyqtgraph.Qt import QtCore, QtGui
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph.GraphicsScene import GraphicsScene
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("GraphicsScene Example")
|
||||
win = pg.GraphicsView()
|
||||
win.show()
|
||||
|
||||
|
@ -11,7 +11,7 @@ from pyqtgraph.Qt import QtGui, QtCore
|
||||
import pyqtgraph as pg
|
||||
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Histogram Lookup Table Example")
|
||||
win = QtGui.QMainWindow()
|
||||
win.resize(800,600)
|
||||
win.show()
|
||||
|
@ -11,7 +11,7 @@ import numpy as np
|
||||
import pyqtgraph as pg
|
||||
import pyqtgraph.ptime as ptime
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("ImageItem Example")
|
||||
|
||||
## Create window with GraphicsView widget
|
||||
win = pg.GraphicsLayoutWidget()
|
||||
|
@ -20,7 +20,7 @@ import pyqtgraph as pg
|
||||
# Interpret image data as row-major instead of col-major
|
||||
pg.setConfigOptions(imageAxisOrder='row-major')
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("ImageView Example")
|
||||
|
||||
## Create window with ImageView widget
|
||||
win = QtGui.QMainWindow()
|
||||
|
@ -9,7 +9,7 @@ import numpy as np
|
||||
import pyqtgraph as pg
|
||||
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("InfiniteLine Example")
|
||||
win = pg.GraphicsLayoutWidget(show=True, title="Plotting items examples")
|
||||
win.resize(1000,600)
|
||||
|
||||
|
@ -12,7 +12,7 @@ from pyqtgraph.Qt import QtGui, QtCore
|
||||
import pyqtgraph as pg
|
||||
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Joystick Button Example")
|
||||
mw = QtGui.QMainWindow()
|
||||
mw.resize(300,50)
|
||||
mw.setWindowTitle('pyqtgraph example: JoystickButton')
|
||||
|
@ -39,7 +39,6 @@ legend.addItem(c1, 'curve1')
|
||||
legend.addItem(c2, 'curve2')
|
||||
legend.addItem(s1, 'scatter')
|
||||
|
||||
|
||||
## Start Qt event loop unless running in interactive mode or using pyside.
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
|
@ -10,7 +10,7 @@ from pyqtgraph.Qt import QtGui, QtCore
|
||||
import numpy as np
|
||||
import pyqtgraph as pg
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Log Plot Example")
|
||||
|
||||
win = pg.GraphicsLayoutWidget(show=True, title="Basic plotting examples")
|
||||
win.resize(1000,600)
|
||||
|
@ -12,7 +12,7 @@ from pyqtgraph.Qt import QtGui, QtCore
|
||||
import numpy as np
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph.ptime import time
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("MultiPlot Speed Test")
|
||||
|
||||
plot = pg.plot()
|
||||
plot.setWindowTitle('pyqtgraph example: MultiPlotSpeedTest')
|
||||
|
@ -14,7 +14,7 @@ except:
|
||||
print("MultiPlot is only used with MetaArray for now (and you do not have the metaarray package)")
|
||||
exit()
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("MultiPlot Widget Example")
|
||||
mw = QtGui.QMainWindow()
|
||||
mw.resize(800,800)
|
||||
pw = MultiPlotWidget()
|
||||
|
86
examples/NonUniformImage.py
Normal file
86
examples/NonUniformImage.py
Normal file
@ -0,0 +1,86 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Display a non-uniform image.
|
||||
This example displays 2-d data as an image with non-uniformly
|
||||
distributed sample points.
|
||||
"""
|
||||
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
from pyqtgraph.Qt import QtGui, QtCore
|
||||
import pyqtgraph as pg
|
||||
import numpy as np
|
||||
from pyqtgraph.graphicsItems.GradientEditorItem import Gradients
|
||||
from pyqtgraph.graphicsItems.NonUniformImage import NonUniformImage
|
||||
|
||||
|
||||
RPM2RADS = 2 * np.pi / 60
|
||||
RADS2RPM = 1 / RPM2RADS
|
||||
|
||||
kfric = 1 # [Ws/rad] angular damping coefficient [0;100]
|
||||
kfric3 = 1.5e-6 # [Ws3/rad3] angular damping coefficient (3rd order) [0;10-3]
|
||||
psi = 0.2 # [Vs] flux linkage [0.001;10]
|
||||
res = 5e-3 # [Ohm] resistance [0;100]
|
||||
v_ref = 200 # [V] reference DC voltage [0;1000]
|
||||
k_v = 5 # linear voltage coefficient [-100;100]
|
||||
|
||||
# create the (non-uniform) scales
|
||||
tau = np.array([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 120, 140, 160, 180, 200, 220], dtype=np.float32)
|
||||
w = np.array([0, 250, 500, 750, 1000, 1500, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000], dtype=np.float32) * RPM2RADS
|
||||
v = 380
|
||||
|
||||
# calculate the power losses
|
||||
TAU, W = np.meshgrid(tau, w, indexing='ij')
|
||||
V = np.ones_like(TAU) * v
|
||||
|
||||
P_loss = kfric * W + kfric3 * W ** 3 + (res * (TAU / psi) ** 2) + k_v * (V - v_ref)
|
||||
|
||||
P_mech = TAU * W
|
||||
P_loss[P_mech > 1.5e5] = np.NaN
|
||||
|
||||
# green - orange - red
|
||||
Gradients['gor'] = {'ticks': [(0.0, (74, 158, 71)), (0.5, (255, 230, 0)), (1, (191, 79, 76))], 'mode': 'rgb'}
|
||||
|
||||
app = pg.mkQApp("NonUniform Image Example")
|
||||
|
||||
win = QtGui.QMainWindow()
|
||||
cw = pg.GraphicsLayoutWidget()
|
||||
win.show()
|
||||
win.resize(600, 400)
|
||||
win.setCentralWidget(cw)
|
||||
win.setWindowTitle('pyqtgraph example: Non-uniform Image')
|
||||
|
||||
p = cw.addPlot(title="Power Losses [W]", row=0, col=0)
|
||||
|
||||
lut = pg.HistogramLUTItem()
|
||||
|
||||
p.setMouseEnabled(x=False, y=False)
|
||||
|
||||
cw.addItem(lut)
|
||||
|
||||
# load the gradient
|
||||
lut.gradient.loadPreset('gor')
|
||||
|
||||
image = NonUniformImage(w * RADS2RPM, tau, P_loss.T)
|
||||
image.setLookupTable(lut, autoLevel=True)
|
||||
image.setZValue(-1)
|
||||
p.addItem(image)
|
||||
|
||||
h = image.getHistogram()
|
||||
lut.plot.setData(*h)
|
||||
|
||||
p.showGrid(x=True, y=True)
|
||||
|
||||
p.setLabel(axis='bottom', text='Speed [rpm]')
|
||||
p.setLabel(axis='left', text='Torque [Nm]')
|
||||
|
||||
# elevate the grid lines
|
||||
p.axes['bottom']['item'].setZValue(1000)
|
||||
p.axes['left']['item'].setZValue(1000)
|
||||
|
||||
|
||||
## Start Qt event loop unless running in interactive mode or using pyside.
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
|
||||
QtGui.QApplication.instance().exec_()
|
@ -11,7 +11,7 @@ import numpy as np
|
||||
import pyqtgraph as pg
|
||||
import pyqtgraph.ptime as ptime
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("PColorMesh Example")
|
||||
|
||||
## Create window with GraphicsView widget
|
||||
win = pg.GraphicsLayoutWidget()
|
||||
|
@ -12,7 +12,7 @@ import numpy as np
|
||||
import pyqtgraph as pg
|
||||
|
||||
#QtGui.QApplication.setGraphicsSystem('raster')
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Plot Auto Range Example")
|
||||
#mw = QtGui.QMainWindow()
|
||||
#mw.resize(800,800)
|
||||
|
||||
|
@ -12,7 +12,7 @@ from pyqtgraph.Qt import QtGui, QtCore
|
||||
import numpy as np
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph.ptime import time
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Plot Speed Test")
|
||||
|
||||
p = pg.plot()
|
||||
p.setWindowTitle('pyqtgraph example: PlotSpeedTest')
|
||||
|
@ -13,7 +13,7 @@ import numpy as np
|
||||
import pyqtgraph as pg
|
||||
|
||||
#QtGui.QApplication.setGraphicsSystem('raster')
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Plotting Example")
|
||||
#mw = QtGui.QMainWindow()
|
||||
#mw.resize(800,800)
|
||||
|
||||
|
@ -9,7 +9,7 @@ import time
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph.Qt import QtCore, QtGui
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Progress Dialog Example")
|
||||
|
||||
|
||||
def runStage(i):
|
||||
|
@ -32,7 +32,7 @@ arr[8:13, 44:46] = 10
|
||||
|
||||
|
||||
## create GUI
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("ROI Examples")
|
||||
w = pg.GraphicsLayoutWidget(show=True, size=(1000,800), border=True)
|
||||
w.setWindowTitle('pyqtgraph example: ROI Examples')
|
||||
|
||||
|
@ -11,7 +11,7 @@ import pyqtgraph as pg
|
||||
pg.setConfigOptions(imageAxisOrder='row-major')
|
||||
|
||||
## create GUI
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("ROI Types Examples")
|
||||
|
||||
w = pg.GraphicsLayoutWidget(show=True, size=(800,800), border=True)
|
||||
v = w.addViewBox(colspan=2)
|
||||
|
@ -24,6 +24,8 @@ pg.setConfigOptions(antialias=True) ## this will be expensive for the local plo
|
||||
view.pg.setConfigOptions(antialias=True) ## prettier plots at no cost to the main process!
|
||||
view.setWindowTitle('pyqtgraph example: RemoteSpeedTest')
|
||||
|
||||
app.aboutToQuit.connect(view.close)
|
||||
|
||||
label = QtGui.QLabel()
|
||||
rcheck = QtGui.QCheckBox('plot remote')
|
||||
rcheck.setChecked(True)
|
||||
|
@ -14,7 +14,7 @@ import numpy as np
|
||||
from collections import namedtuple
|
||||
from itertools import chain
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Scatter Plot Item Example")
|
||||
mw = QtGui.QMainWindow()
|
||||
mw.resize(800,800)
|
||||
view = pg.GraphicsLayoutWidget() ## GraphicsView with GraphicsLayout inserted by default
|
||||
|
@ -17,21 +17,16 @@ import numpy as np
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph.ptime import time
|
||||
#QtGui.QApplication.setGraphicsSystem('raster')
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Scatter Plot Speed Test")
|
||||
#mw = QtGui.QMainWindow()
|
||||
#mw.resize(800,800)
|
||||
if QT_LIB == 'PySide':
|
||||
from ScatterPlotSpeedTestTemplate_pyside import Ui_Form
|
||||
elif QT_LIB == 'PySide2':
|
||||
from ScatterPlotSpeedTestTemplate_pyside2 import Ui_Form
|
||||
elif QT_LIB == 'PyQt5':
|
||||
from ScatterPlotSpeedTestTemplate_pyqt5 import Ui_Form
|
||||
else:
|
||||
from ScatterPlotSpeedTestTemplate_pyqt import Ui_Form
|
||||
import importlib
|
||||
ui_template = importlib.import_module(
|
||||
f'ScatterPlotSpeedTestTemplate_{QT_LIB.lower()}')
|
||||
|
||||
win = QtGui.QWidget()
|
||||
win.setWindowTitle('pyqtgraph example: ScatterPlotSpeedTest')
|
||||
ui = Ui_Form()
|
||||
ui = ui_template.Ui_Form()
|
||||
ui.setupUi(win)
|
||||
win.show()
|
||||
|
||||
|
@ -1,49 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Form implementation generated from reading ui file './examples/ScatterPlotSpeedTestTemplate.ui'
|
||||
#
|
||||
# Created: Fri Sep 21 15:39:09 2012
|
||||
# by: PyQt4 UI code generator 4.9.1
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
try:
|
||||
_fromUtf8 = QtCore.QString.fromUtf8
|
||||
except AttributeError:
|
||||
_fromUtf8 = lambda s: s
|
||||
|
||||
class Ui_Form(object):
|
||||
def setupUi(self, Form):
|
||||
Form.setObjectName(_fromUtf8("Form"))
|
||||
Form.resize(400, 300)
|
||||
self.gridLayout = QtGui.QGridLayout(Form)
|
||||
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
|
||||
self.sizeSpin = QtGui.QSpinBox(Form)
|
||||
self.sizeSpin.setProperty("value", 10)
|
||||
self.sizeSpin.setObjectName(_fromUtf8("sizeSpin"))
|
||||
self.gridLayout.addWidget(self.sizeSpin, 1, 1, 1, 1)
|
||||
self.pixelModeCheck = QtGui.QCheckBox(Form)
|
||||
self.pixelModeCheck.setObjectName(_fromUtf8("pixelModeCheck"))
|
||||
self.gridLayout.addWidget(self.pixelModeCheck, 1, 3, 1, 1)
|
||||
self.label = QtGui.QLabel(Form)
|
||||
self.label.setObjectName(_fromUtf8("label"))
|
||||
self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
|
||||
self.plot = PlotWidget(Form)
|
||||
self.plot.setObjectName(_fromUtf8("plot"))
|
||||
self.gridLayout.addWidget(self.plot, 0, 0, 1, 4)
|
||||
self.randCheck = QtGui.QCheckBox(Form)
|
||||
self.randCheck.setObjectName(_fromUtf8("randCheck"))
|
||||
self.gridLayout.addWidget(self.randCheck, 1, 2, 1, 1)
|
||||
|
||||
self.retranslateUi(Form)
|
||||
QtCore.QMetaObject.connectSlotsByName(Form)
|
||||
|
||||
def retranslateUi(self, Form):
|
||||
Form.setWindowTitle(QtGui.QApplication.translate("Form", "PyQtGraph", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.pixelModeCheck.setText(QtGui.QApplication.translate("Form", "pixel mode", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label.setText(QtGui.QApplication.translate("Form", "Size", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.randCheck.setText(QtGui.QApplication.translate("Form", "Randomize", None, QtGui.QApplication.UnicodeUTF8))
|
||||
|
||||
from pyqtgraph import PlotWidget
|
44
examples/ScatterPlotSpeedTestTemplate_pyqt6.py
Normal file
44
examples/ScatterPlotSpeedTestTemplate_pyqt6.py
Normal file
@ -0,0 +1,44 @@
|
||||
# Form implementation generated from reading ui file 'examples\ScatterPlotSpeedTestTemplate.ui'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.0.0
|
||||
#
|
||||
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
|
||||
# run again. Do not edit this file unless you know what you are doing.
|
||||
|
||||
|
||||
from PyQt6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class Ui_Form(object):
|
||||
def setupUi(self, Form):
|
||||
Form.setObjectName("Form")
|
||||
Form.resize(400, 300)
|
||||
self.gridLayout = QtWidgets.QGridLayout(Form)
|
||||
self.gridLayout.setObjectName("gridLayout")
|
||||
self.sizeSpin = QtWidgets.QSpinBox(Form)
|
||||
self.sizeSpin.setProperty("value", 10)
|
||||
self.sizeSpin.setObjectName("sizeSpin")
|
||||
self.gridLayout.addWidget(self.sizeSpin, 1, 1, 1, 1)
|
||||
self.pixelModeCheck = QtWidgets.QCheckBox(Form)
|
||||
self.pixelModeCheck.setObjectName("pixelModeCheck")
|
||||
self.gridLayout.addWidget(self.pixelModeCheck, 1, 3, 1, 1)
|
||||
self.label = QtWidgets.QLabel(Form)
|
||||
self.label.setObjectName("label")
|
||||
self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
|
||||
self.plot = PlotWidget(Form)
|
||||
self.plot.setObjectName("plot")
|
||||
self.gridLayout.addWidget(self.plot, 0, 0, 1, 4)
|
||||
self.randCheck = QtWidgets.QCheckBox(Form)
|
||||
self.randCheck.setObjectName("randCheck")
|
||||
self.gridLayout.addWidget(self.randCheck, 1, 2, 1, 1)
|
||||
|
||||
self.retranslateUi(Form)
|
||||
QtCore.QMetaObject.connectSlotsByName(Form)
|
||||
|
||||
def retranslateUi(self, Form):
|
||||
_translate = QtCore.QCoreApplication.translate
|
||||
Form.setWindowTitle(_translate("Form", "PyQtGraph"))
|
||||
self.pixelModeCheck.setText(_translate("Form", "pixel mode"))
|
||||
self.label.setText(_translate("Form", "Size"))
|
||||
self.randCheck.setText(_translate("Form", "Randomize"))
|
||||
from pyqtgraph import PlotWidget
|
@ -1,44 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Form implementation generated from reading ui file './examples/ScatterPlotSpeedTestTemplate.ui'
|
||||
#
|
||||
# Created: Fri Sep 21 15:39:09 2012
|
||||
# by: pyside-uic 0.2.13 running on PySide 1.1.0
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
||||
from PySide import QtCore, QtGui
|
||||
|
||||
class Ui_Form(object):
|
||||
def setupUi(self, Form):
|
||||
Form.setObjectName("Form")
|
||||
Form.resize(400, 300)
|
||||
self.gridLayout = QtGui.QGridLayout(Form)
|
||||
self.gridLayout.setObjectName("gridLayout")
|
||||
self.sizeSpin = QtGui.QSpinBox(Form)
|
||||
self.sizeSpin.setProperty("value", 10)
|
||||
self.sizeSpin.setObjectName("sizeSpin")
|
||||
self.gridLayout.addWidget(self.sizeSpin, 1, 1, 1, 1)
|
||||
self.pixelModeCheck = QtGui.QCheckBox(Form)
|
||||
self.pixelModeCheck.setObjectName("pixelModeCheck")
|
||||
self.gridLayout.addWidget(self.pixelModeCheck, 1, 3, 1, 1)
|
||||
self.label = QtGui.QLabel(Form)
|
||||
self.label.setObjectName("label")
|
||||
self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
|
||||
self.plot = PlotWidget(Form)
|
||||
self.plot.setObjectName("plot")
|
||||
self.gridLayout.addWidget(self.plot, 0, 0, 1, 4)
|
||||
self.randCheck = QtGui.QCheckBox(Form)
|
||||
self.randCheck.setObjectName("randCheck")
|
||||
self.gridLayout.addWidget(self.randCheck, 1, 2, 1, 1)
|
||||
|
||||
self.retranslateUi(Form)
|
||||
QtCore.QMetaObject.connectSlotsByName(Form)
|
||||
|
||||
def retranslateUi(self, Form):
|
||||
Form.setWindowTitle(QtGui.QApplication.translate("Form", "PyQtGraph", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.pixelModeCheck.setText(QtGui.QApplication.translate("Form", "pixel mode", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label.setText(QtGui.QApplication.translate("Form", "Size", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.randCheck.setText(QtGui.QApplication.translate("Form", "Randomize", None, QtGui.QApplication.UnicodeUTF8))
|
||||
|
||||
from pyqtgraph import PlotWidget
|
63
examples/ScatterPlotSpeedTestTemplate_pyside6.py
Normal file
63
examples/ScatterPlotSpeedTestTemplate_pyside6.py
Normal file
@ -0,0 +1,63 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
################################################################################
|
||||
## Form generated from reading UI file 'ScatterPlotSpeedTestTemplate.ui'
|
||||
##
|
||||
## Created by: Qt User Interface Compiler version 6.0.0
|
||||
##
|
||||
## WARNING! All changes made in this file will be lost when recompiling UI file!
|
||||
################################################################################
|
||||
|
||||
from PySide6.QtCore import *
|
||||
from PySide6.QtGui import *
|
||||
from PySide6.QtWidgets import *
|
||||
|
||||
from pyqtgraph import PlotWidget
|
||||
|
||||
|
||||
class Ui_Form(object):
|
||||
def setupUi(self, Form):
|
||||
if not Form.objectName():
|
||||
Form.setObjectName(u"Form")
|
||||
Form.resize(400, 300)
|
||||
self.gridLayout = QGridLayout(Form)
|
||||
self.gridLayout.setObjectName(u"gridLayout")
|
||||
self.sizeSpin = QSpinBox(Form)
|
||||
self.sizeSpin.setObjectName(u"sizeSpin")
|
||||
self.sizeSpin.setValue(10)
|
||||
|
||||
self.gridLayout.addWidget(self.sizeSpin, 1, 1, 1, 1)
|
||||
|
||||
self.pixelModeCheck = QCheckBox(Form)
|
||||
self.pixelModeCheck.setObjectName(u"pixelModeCheck")
|
||||
|
||||
self.gridLayout.addWidget(self.pixelModeCheck, 1, 3, 1, 1)
|
||||
|
||||
self.label = QLabel(Form)
|
||||
self.label.setObjectName(u"label")
|
||||
|
||||
self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
|
||||
|
||||
self.plot = PlotWidget(Form)
|
||||
self.plot.setObjectName(u"plot")
|
||||
|
||||
self.gridLayout.addWidget(self.plot, 0, 0, 1, 4)
|
||||
|
||||
self.randCheck = QCheckBox(Form)
|
||||
self.randCheck.setObjectName(u"randCheck")
|
||||
|
||||
self.gridLayout.addWidget(self.randCheck, 1, 2, 1, 1)
|
||||
|
||||
|
||||
self.retranslateUi(Form)
|
||||
|
||||
QMetaObject.connectSlotsByName(Form)
|
||||
# setupUi
|
||||
|
||||
def retranslateUi(self, Form):
|
||||
Form.setWindowTitle(QCoreApplication.translate("Form", u"PyQtGraph", None))
|
||||
self.pixelModeCheck.setText(QCoreApplication.translate("Form", u"pixel mode", None))
|
||||
self.label.setText(QCoreApplication.translate("Form", u"Size", None))
|
||||
self.randCheck.setText(QCoreApplication.translate("Form", u"Randomize", None))
|
||||
# retranslateUi
|
||||
|
@ -15,7 +15,7 @@ from pyqtgraph.Qt import QtCore, QtGui
|
||||
import numpy as np
|
||||
import ast
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("SpinBox Example")
|
||||
|
||||
|
||||
spins = [
|
||||
|
@ -10,7 +10,7 @@ import initExample ## Add path to library (just for examples; you do not need th
|
||||
from pyqtgraph.Qt import QtGui, QtCore
|
||||
import pyqtgraph as pg
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Symbols Examples")
|
||||
win = pg.GraphicsLayoutWidget(show=True, title="Scatter Plot Symbols")
|
||||
win.resize(1000,600)
|
||||
|
||||
|
@ -9,7 +9,7 @@ import pyqtgraph as pg
|
||||
from pyqtgraph.Qt import QtCore, QtGui
|
||||
import numpy as np
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Table Widget Example")
|
||||
|
||||
w = pg.TableWidget()
|
||||
w.show()
|
||||
|
@ -10,7 +10,7 @@ from pyqtgraph.Qt import QtCore, QtGui
|
||||
import numpy as np
|
||||
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("TreeWidget Example")
|
||||
|
||||
w = pg.TreeWidget()
|
||||
w.setColumnCount(2)
|
||||
|
@ -6,45 +6,89 @@ it is being scaled and/or converted by lookup table, and whether OpenGL
|
||||
is used by the view widget
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
|
||||
from pyqtgraph.Qt import QtGui, QtCore, QT_LIB
|
||||
import numpy as np
|
||||
|
||||
import pyqtgraph as pg
|
||||
import pyqtgraph.ptime as ptime
|
||||
from pyqtgraph.Qt import QtGui, QtCore, QT_LIB
|
||||
|
||||
if QT_LIB == 'PySide':
|
||||
import VideoTemplate_pyside as VideoTemplate
|
||||
elif QT_LIB == 'PySide2':
|
||||
import VideoTemplate_pyside2 as VideoTemplate
|
||||
elif QT_LIB == 'PyQt5':
|
||||
import VideoTemplate_pyqt5 as VideoTemplate
|
||||
else:
|
||||
import VideoTemplate_pyqt as VideoTemplate
|
||||
|
||||
import importlib
|
||||
ui_template = importlib.import_module(f'VideoTemplate_{QT_LIB.lower()}')
|
||||
|
||||
try:
|
||||
import cupy as cp
|
||||
pg.setConfigOption("useCupy", True)
|
||||
_has_cupy = True
|
||||
except ImportError:
|
||||
cp = None
|
||||
_has_cupy = False
|
||||
|
||||
parser = argparse.ArgumentParser(description="Benchmark for testing video performance")
|
||||
parser.add_argument('--cuda', default=False, action='store_true', help="Use CUDA to process on the GPU", dest="cuda")
|
||||
parser.add_argument('--dtype', default='uint8', choices=['uint8', 'uint16', 'float'], help="Image dtype (uint8, uint16, or float)")
|
||||
parser.add_argument('--frames', default=3, type=int, help="Number of image frames to generate (default=3)")
|
||||
parser.add_argument('--image-mode', default='mono', choices=['mono', 'rgb'], help="Image data mode (mono or rgb)", dest='image_mode')
|
||||
parser.add_argument('--levels', default=None, type=lambda s: tuple([float(x) for x in s.split(',')]), help="min,max levels to scale monochromatic image dynamic range, or rmin,rmax,gmin,gmax,bmin,bmax to scale rgb")
|
||||
parser.add_argument('--lut', default=False, action='store_true', help="Use color lookup table")
|
||||
parser.add_argument('--lut-alpha', default=False, action='store_true', help="Use alpha color lookup table", dest='lut_alpha')
|
||||
parser.add_argument('--size', default='512x512', type=lambda s: tuple([int(x) for x in s.split('x')]), help="WxH image dimensions default='512x512'")
|
||||
args = parser.parse_args(sys.argv[1:])
|
||||
|
||||
#QtGui.QApplication.setGraphicsSystem('raster')
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Video Speed Test Example")
|
||||
|
||||
win = QtGui.QMainWindow()
|
||||
win.setWindowTitle('pyqtgraph example: VideoSpeedTest')
|
||||
ui = VideoTemplate.Ui_MainWindow()
|
||||
ui = ui_template.Ui_MainWindow()
|
||||
ui.setupUi(win)
|
||||
win.show()
|
||||
|
||||
try:
|
||||
from pyqtgraph.widgets.RawImageWidget import RawImageGLWidget
|
||||
except ImportError:
|
||||
RawImageGLWidget = None
|
||||
ui.rawGLRadio.setEnabled(False)
|
||||
ui.rawGLRadio.setText(ui.rawGLRadio.text() + " (OpenGL not available)")
|
||||
else:
|
||||
ui.rawGLImg = RawImageGLWidget()
|
||||
ui.stack.addWidget(ui.rawGLImg)
|
||||
|
||||
# read in CLI args
|
||||
ui.cudaCheck.setChecked(args.cuda and _has_cupy)
|
||||
ui.cudaCheck.setEnabled(_has_cupy)
|
||||
ui.framesSpin.setValue(args.frames)
|
||||
ui.widthSpin.setValue(args.size[0])
|
||||
ui.heightSpin.setValue(args.size[1])
|
||||
ui.dtypeCombo.setCurrentText(args.dtype)
|
||||
ui.rgbCheck.setChecked(args.image_mode=='rgb')
|
||||
ui.maxSpin1.setOpts(value=255, step=1)
|
||||
ui.minSpin1.setOpts(value=0, step=1)
|
||||
levelSpins = [ui.minSpin1, ui.maxSpin1, ui.minSpin2, ui.maxSpin2, ui.minSpin3, ui.maxSpin3]
|
||||
if args.cuda and _has_cupy:
|
||||
xp = cp
|
||||
else:
|
||||
xp = np
|
||||
if args.levels is None:
|
||||
ui.scaleCheck.setChecked(False)
|
||||
ui.rgbLevelsCheck.setChecked(False)
|
||||
else:
|
||||
ui.scaleCheck.setChecked(True)
|
||||
if len(args.levels) == 2:
|
||||
ui.rgbLevelsCheck.setChecked(False)
|
||||
ui.minSpin1.setValue(args.levels[0])
|
||||
ui.maxSpin1.setValue(args.levels[1])
|
||||
elif len(args.levels) == 6:
|
||||
ui.rgbLevelsCheck.setChecked(True)
|
||||
for spin,val in zip(levelSpins, args.levels):
|
||||
spin.setValue(val)
|
||||
else:
|
||||
raise ValueError("levels argument must be 2 or 6 comma-separated values (got %r)" % (args.levels,))
|
||||
ui.lutCheck.setChecked(args.lut)
|
||||
ui.alphaCheck.setChecked(args.lut_alpha)
|
||||
|
||||
|
||||
#ui.graphicsView.useOpenGL() ## buggy, but you can try it if you need extra speed.
|
||||
|
||||
@ -53,7 +97,8 @@ ui.graphicsView.setCentralItem(vb)
|
||||
vb.setAspectLocked()
|
||||
img = pg.ImageItem()
|
||||
vb.addItem(img)
|
||||
vb.setRange(QtCore.QRectF(0, 0, 512, 512))
|
||||
|
||||
|
||||
|
||||
LUT = None
|
||||
def updateLUT():
|
||||
@ -64,74 +109,94 @@ def updateLUT():
|
||||
else:
|
||||
n = 4096
|
||||
LUT = ui.gradient.getLookupTable(n, alpha=ui.alphaCheck.isChecked())
|
||||
if _has_cupy and xp == cp:
|
||||
LUT = cp.asarray(LUT)
|
||||
ui.gradient.sigGradientChanged.connect(updateLUT)
|
||||
updateLUT()
|
||||
|
||||
ui.alphaCheck.toggled.connect(updateLUT)
|
||||
|
||||
def updateScale():
|
||||
global ui
|
||||
spins = [ui.minSpin1, ui.maxSpin1, ui.minSpin2, ui.maxSpin2, ui.minSpin3, ui.maxSpin3]
|
||||
global ui, levelSpins
|
||||
if ui.rgbLevelsCheck.isChecked():
|
||||
for s in spins[2:]:
|
||||
for s in levelSpins[2:]:
|
||||
s.setEnabled(True)
|
||||
else:
|
||||
for s in spins[2:]:
|
||||
for s in levelSpins[2:]:
|
||||
s.setEnabled(False)
|
||||
|
||||
updateScale()
|
||||
|
||||
ui.rgbLevelsCheck.toggled.connect(updateScale)
|
||||
|
||||
|
||||
cache = {}
|
||||
def mkData():
|
||||
with pg.BusyCursor():
|
||||
global data, cache, ui
|
||||
global data, cache, ui, xp
|
||||
frames = ui.framesSpin.value()
|
||||
width = ui.widthSpin.value()
|
||||
height = ui.heightSpin.value()
|
||||
dtype = (ui.dtypeCombo.currentText(), ui.rgbCheck.isChecked(), frames, width, height)
|
||||
if dtype not in cache:
|
||||
if dtype[0] == 'uint8':
|
||||
dt = np.uint8
|
||||
cacheKey = (ui.dtypeCombo.currentText(), ui.rgbCheck.isChecked(), frames, width, height)
|
||||
if cacheKey not in cache:
|
||||
if cacheKey[0] == 'uint8':
|
||||
dt = xp.uint8
|
||||
loc = 128
|
||||
scale = 64
|
||||
mx = 255
|
||||
elif dtype[0] == 'uint16':
|
||||
dt = np.uint16
|
||||
elif cacheKey[0] == 'uint16':
|
||||
dt = xp.uint16
|
||||
loc = 4096
|
||||
scale = 1024
|
||||
mx = 2**16
|
||||
elif dtype[0] == 'float':
|
||||
dt = np.float
|
||||
elif cacheKey[0] == 'float':
|
||||
dt = xp.float
|
||||
loc = 1.0
|
||||
scale = 0.1
|
||||
mx = 1.0
|
||||
else:
|
||||
raise ValueError(f"unable to handle dtype: {cacheKey[0]}")
|
||||
|
||||
if ui.rgbCheck.isChecked():
|
||||
data = np.random.normal(size=(frames,width,height,3), loc=loc, scale=scale)
|
||||
data = xp.random.normal(size=(frames,width,height,3), loc=loc, scale=scale)
|
||||
data = pg.gaussianFilter(data, (0, 6, 6, 0))
|
||||
else:
|
||||
data = np.random.normal(size=(frames,width,height), loc=loc, scale=scale)
|
||||
data = xp.random.normal(size=(frames,width,height), loc=loc, scale=scale)
|
||||
data = pg.gaussianFilter(data, (0, 6, 6))
|
||||
if dtype[0] != 'float':
|
||||
data = np.clip(data, 0, mx)
|
||||
if cacheKey[0] != 'float':
|
||||
data = xp.clip(data, 0, mx)
|
||||
data = data.astype(dt)
|
||||
data[:, 10, 10:50] = mx
|
||||
data[:, 9:12, 48] = mx
|
||||
data[:, 8:13, 47] = mx
|
||||
cache = {dtype: data} # clear to save memory (but keep one to prevent unnecessary regeneration)
|
||||
|
||||
data = cache[dtype]
|
||||
cache = {cacheKey: data} # clear to save memory (but keep one to prevent unnecessary regeneration)
|
||||
|
||||
data = cache[cacheKey]
|
||||
updateLUT()
|
||||
updateSize()
|
||||
|
||||
def updateSize():
|
||||
global ui
|
||||
global ui, vb
|
||||
frames = ui.framesSpin.value()
|
||||
width = ui.widthSpin.value()
|
||||
height = ui.heightSpin.value()
|
||||
dtype = np.dtype(str(ui.dtypeCombo.currentText()))
|
||||
dtype = xp.dtype(str(ui.dtypeCombo.currentText()))
|
||||
rgb = 3 if ui.rgbCheck.isChecked() else 1
|
||||
ui.sizeLabel.setText('%d MB' % (frames * width * height * rgb * dtype.itemsize / 1e6))
|
||||
|
||||
vb.setRange(QtCore.QRectF(0, 0, width, height))
|
||||
|
||||
|
||||
def noticeCudaCheck():
|
||||
global xp, cache
|
||||
cache = {}
|
||||
if ui.cudaCheck.isChecked():
|
||||
if _has_cupy:
|
||||
xp = cp
|
||||
else:
|
||||
xp = np
|
||||
ui.cudaCheck.setChecked(False)
|
||||
else:
|
||||
xp = np
|
||||
mkData()
|
||||
|
||||
mkData()
|
||||
|
||||
@ -145,7 +210,7 @@ ui.framesSpin.editingFinished.connect(mkData)
|
||||
ui.widthSpin.valueChanged.connect(updateSize)
|
||||
ui.heightSpin.valueChanged.connect(updateSize)
|
||||
ui.framesSpin.valueChanged.connect(updateSize)
|
||||
|
||||
ui.cudaCheck.toggled.connect(noticeCudaCheck)
|
||||
|
||||
|
||||
ptr = 0
|
||||
@ -157,14 +222,14 @@ def update():
|
||||
useLut = LUT
|
||||
else:
|
||||
useLut = None
|
||||
|
||||
|
||||
downsample = ui.downsampleCheck.isChecked()
|
||||
|
||||
if ui.scaleCheck.isChecked():
|
||||
if ui.rgbLevelsCheck.isChecked():
|
||||
useScale = [
|
||||
[ui.minSpin1.value(), ui.maxSpin1.value()],
|
||||
[ui.minSpin2.value(), ui.maxSpin2.value()],
|
||||
[ui.minSpin1.value(), ui.maxSpin1.value()],
|
||||
[ui.minSpin2.value(), ui.maxSpin2.value()],
|
||||
[ui.minSpin3.value(), ui.maxSpin3.value()]]
|
||||
else:
|
||||
useScale = [ui.minSpin1.value(), ui.maxSpin1.value()]
|
||||
@ -181,7 +246,7 @@ def update():
|
||||
img.setImage(data[ptr%data.shape[0]], autoLevels=False, levels=useScale, lut=useLut, autoDownsample=downsample)
|
||||
ui.stack.setCurrentIndex(0)
|
||||
#img.setImage(data[ptr%data.shape[0]], autoRange=False)
|
||||
|
||||
|
||||
ptr += 1
|
||||
now = ptime.time()
|
||||
dt = now - lastTime
|
||||
@ -196,7 +261,7 @@ def update():
|
||||
timer = QtCore.QTimer()
|
||||
timer.timeout.connect(update)
|
||||
timer.start(0)
|
||||
|
||||
|
||||
|
||||
|
||||
## Start Qt event loop unless running in interactive mode or using pyside.
|
||||
|
@ -15,6 +15,13 @@
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="9" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="cudaCheck">
|
||||
<property name="text">
|
||||
<string>Use CUDA (GPU) if available</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="downsampleCheck">
|
||||
<property name="text">
|
||||
|
@ -1,212 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Form implementation generated from reading ui file 'examples/VideoTemplate.ui'
|
||||
#
|
||||
# Created by: PyQt4 UI code generator 4.11.4
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
try:
|
||||
_fromUtf8 = QtCore.QString.fromUtf8
|
||||
except AttributeError:
|
||||
def _fromUtf8(s):
|
||||
return s
|
||||
|
||||
try:
|
||||
_encoding = QtGui.QApplication.UnicodeUTF8
|
||||
def _translate(context, text, disambig):
|
||||
return QtGui.QApplication.translate(context, text, disambig, _encoding)
|
||||
except AttributeError:
|
||||
def _translate(context, text, disambig):
|
||||
return QtGui.QApplication.translate(context, text, disambig)
|
||||
|
||||
class Ui_MainWindow(object):
|
||||
def setupUi(self, MainWindow):
|
||||
MainWindow.setObjectName(_fromUtf8("MainWindow"))
|
||||
MainWindow.resize(695, 798)
|
||||
self.centralwidget = QtGui.QWidget(MainWindow)
|
||||
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
|
||||
self.gridLayout_2 = QtGui.QGridLayout(self.centralwidget)
|
||||
self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
|
||||
self.downsampleCheck = QtGui.QCheckBox(self.centralwidget)
|
||||
self.downsampleCheck.setObjectName(_fromUtf8("downsampleCheck"))
|
||||
self.gridLayout_2.addWidget(self.downsampleCheck, 8, 0, 1, 2)
|
||||
self.scaleCheck = QtGui.QCheckBox(self.centralwidget)
|
||||
self.scaleCheck.setObjectName(_fromUtf8("scaleCheck"))
|
||||
self.gridLayout_2.addWidget(self.scaleCheck, 4, 0, 1, 1)
|
||||
self.gridLayout = QtGui.QGridLayout()
|
||||
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
|
||||
self.rawRadio = QtGui.QRadioButton(self.centralwidget)
|
||||
self.rawRadio.setObjectName(_fromUtf8("rawRadio"))
|
||||
self.gridLayout.addWidget(self.rawRadio, 3, 0, 1, 1)
|
||||
self.gfxRadio = QtGui.QRadioButton(self.centralwidget)
|
||||
self.gfxRadio.setChecked(True)
|
||||
self.gfxRadio.setObjectName(_fromUtf8("gfxRadio"))
|
||||
self.gridLayout.addWidget(self.gfxRadio, 2, 0, 1, 1)
|
||||
self.stack = QtGui.QStackedWidget(self.centralwidget)
|
||||
self.stack.setObjectName(_fromUtf8("stack"))
|
||||
self.page = QtGui.QWidget()
|
||||
self.page.setObjectName(_fromUtf8("page"))
|
||||
self.gridLayout_3 = QtGui.QGridLayout(self.page)
|
||||
self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
|
||||
self.graphicsView = GraphicsView(self.page)
|
||||
self.graphicsView.setObjectName(_fromUtf8("graphicsView"))
|
||||
self.gridLayout_3.addWidget(self.graphicsView, 0, 0, 1, 1)
|
||||
self.stack.addWidget(self.page)
|
||||
self.page_2 = QtGui.QWidget()
|
||||
self.page_2.setObjectName(_fromUtf8("page_2"))
|
||||
self.gridLayout_4 = QtGui.QGridLayout(self.page_2)
|
||||
self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4"))
|
||||
self.rawImg = RawImageWidget(self.page_2)
|
||||
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.rawImg.sizePolicy().hasHeightForWidth())
|
||||
self.rawImg.setSizePolicy(sizePolicy)
|
||||
self.rawImg.setObjectName(_fromUtf8("rawImg"))
|
||||
self.gridLayout_4.addWidget(self.rawImg, 0, 0, 1, 1)
|
||||
self.stack.addWidget(self.page_2)
|
||||
self.gridLayout.addWidget(self.stack, 0, 0, 1, 1)
|
||||
self.rawGLRadio = QtGui.QRadioButton(self.centralwidget)
|
||||
self.rawGLRadio.setObjectName(_fromUtf8("rawGLRadio"))
|
||||
self.gridLayout.addWidget(self.rawGLRadio, 4, 0, 1, 1)
|
||||
self.gridLayout_2.addLayout(self.gridLayout, 1, 0, 1, 4)
|
||||
self.dtypeCombo = QtGui.QComboBox(self.centralwidget)
|
||||
self.dtypeCombo.setObjectName(_fromUtf8("dtypeCombo"))
|
||||
self.dtypeCombo.addItem(_fromUtf8(""))
|
||||
self.dtypeCombo.addItem(_fromUtf8(""))
|
||||
self.dtypeCombo.addItem(_fromUtf8(""))
|
||||
self.gridLayout_2.addWidget(self.dtypeCombo, 3, 2, 1, 1)
|
||||
self.label = QtGui.QLabel(self.centralwidget)
|
||||
self.label.setObjectName(_fromUtf8("label"))
|
||||
self.gridLayout_2.addWidget(self.label, 3, 0, 1, 1)
|
||||
self.rgbLevelsCheck = QtGui.QCheckBox(self.centralwidget)
|
||||
self.rgbLevelsCheck.setObjectName(_fromUtf8("rgbLevelsCheck"))
|
||||
self.gridLayout_2.addWidget(self.rgbLevelsCheck, 4, 1, 1, 1)
|
||||
self.horizontalLayout_2 = QtGui.QHBoxLayout()
|
||||
self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
|
||||
self.minSpin2 = SpinBox(self.centralwidget)
|
||||
self.minSpin2.setEnabled(False)
|
||||
self.minSpin2.setObjectName(_fromUtf8("minSpin2"))
|
||||
self.horizontalLayout_2.addWidget(self.minSpin2)
|
||||
self.label_3 = QtGui.QLabel(self.centralwidget)
|
||||
self.label_3.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.label_3.setObjectName(_fromUtf8("label_3"))
|
||||
self.horizontalLayout_2.addWidget(self.label_3)
|
||||
self.maxSpin2 = SpinBox(self.centralwidget)
|
||||
self.maxSpin2.setEnabled(False)
|
||||
self.maxSpin2.setObjectName(_fromUtf8("maxSpin2"))
|
||||
self.horizontalLayout_2.addWidget(self.maxSpin2)
|
||||
self.gridLayout_2.addLayout(self.horizontalLayout_2, 5, 2, 1, 1)
|
||||
self.horizontalLayout = QtGui.QHBoxLayout()
|
||||
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
|
||||
self.minSpin1 = SpinBox(self.centralwidget)
|
||||
self.minSpin1.setObjectName(_fromUtf8("minSpin1"))
|
||||
self.horizontalLayout.addWidget(self.minSpin1)
|
||||
self.label_2 = QtGui.QLabel(self.centralwidget)
|
||||
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.label_2.setObjectName(_fromUtf8("label_2"))
|
||||
self.horizontalLayout.addWidget(self.label_2)
|
||||
self.maxSpin1 = SpinBox(self.centralwidget)
|
||||
self.maxSpin1.setObjectName(_fromUtf8("maxSpin1"))
|
||||
self.horizontalLayout.addWidget(self.maxSpin1)
|
||||
self.gridLayout_2.addLayout(self.horizontalLayout, 4, 2, 1, 1)
|
||||
self.horizontalLayout_3 = QtGui.QHBoxLayout()
|
||||
self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3"))
|
||||
self.minSpin3 = SpinBox(self.centralwidget)
|
||||
self.minSpin3.setEnabled(False)
|
||||
self.minSpin3.setObjectName(_fromUtf8("minSpin3"))
|
||||
self.horizontalLayout_3.addWidget(self.minSpin3)
|
||||
self.label_4 = QtGui.QLabel(self.centralwidget)
|
||||
self.label_4.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.label_4.setObjectName(_fromUtf8("label_4"))
|
||||
self.horizontalLayout_3.addWidget(self.label_4)
|
||||
self.maxSpin3 = SpinBox(self.centralwidget)
|
||||
self.maxSpin3.setEnabled(False)
|
||||
self.maxSpin3.setObjectName(_fromUtf8("maxSpin3"))
|
||||
self.horizontalLayout_3.addWidget(self.maxSpin3)
|
||||
self.gridLayout_2.addLayout(self.horizontalLayout_3, 6, 2, 1, 1)
|
||||
self.lutCheck = QtGui.QCheckBox(self.centralwidget)
|
||||
self.lutCheck.setObjectName(_fromUtf8("lutCheck"))
|
||||
self.gridLayout_2.addWidget(self.lutCheck, 7, 0, 1, 1)
|
||||
self.alphaCheck = QtGui.QCheckBox(self.centralwidget)
|
||||
self.alphaCheck.setObjectName(_fromUtf8("alphaCheck"))
|
||||
self.gridLayout_2.addWidget(self.alphaCheck, 7, 1, 1, 1)
|
||||
self.gradient = GradientWidget(self.centralwidget)
|
||||
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.gradient.sizePolicy().hasHeightForWidth())
|
||||
self.gradient.setSizePolicy(sizePolicy)
|
||||
self.gradient.setObjectName(_fromUtf8("gradient"))
|
||||
self.gridLayout_2.addWidget(self.gradient, 7, 2, 1, 2)
|
||||
spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
|
||||
self.gridLayout_2.addItem(spacerItem, 3, 3, 1, 1)
|
||||
self.fpsLabel = QtGui.QLabel(self.centralwidget)
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(12)
|
||||
self.fpsLabel.setFont(font)
|
||||
self.fpsLabel.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.fpsLabel.setObjectName(_fromUtf8("fpsLabel"))
|
||||
self.gridLayout_2.addWidget(self.fpsLabel, 0, 0, 1, 4)
|
||||
self.rgbCheck = QtGui.QCheckBox(self.centralwidget)
|
||||
self.rgbCheck.setObjectName(_fromUtf8("rgbCheck"))
|
||||
self.gridLayout_2.addWidget(self.rgbCheck, 3, 1, 1, 1)
|
||||
self.label_5 = QtGui.QLabel(self.centralwidget)
|
||||
self.label_5.setObjectName(_fromUtf8("label_5"))
|
||||
self.gridLayout_2.addWidget(self.label_5, 2, 0, 1, 1)
|
||||
self.horizontalLayout_4 = QtGui.QHBoxLayout()
|
||||
self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4"))
|
||||
self.framesSpin = QtGui.QSpinBox(self.centralwidget)
|
||||
self.framesSpin.setButtonSymbols(QtGui.QAbstractSpinBox.NoButtons)
|
||||
self.framesSpin.setProperty("value", 10)
|
||||
self.framesSpin.setObjectName(_fromUtf8("framesSpin"))
|
||||
self.horizontalLayout_4.addWidget(self.framesSpin)
|
||||
self.widthSpin = QtGui.QSpinBox(self.centralwidget)
|
||||
self.widthSpin.setButtonSymbols(QtGui.QAbstractSpinBox.PlusMinus)
|
||||
self.widthSpin.setMaximum(10000)
|
||||
self.widthSpin.setProperty("value", 512)
|
||||
self.widthSpin.setObjectName(_fromUtf8("widthSpin"))
|
||||
self.horizontalLayout_4.addWidget(self.widthSpin)
|
||||
self.heightSpin = QtGui.QSpinBox(self.centralwidget)
|
||||
self.heightSpin.setButtonSymbols(QtGui.QAbstractSpinBox.NoButtons)
|
||||
self.heightSpin.setMaximum(10000)
|
||||
self.heightSpin.setProperty("value", 512)
|
||||
self.heightSpin.setObjectName(_fromUtf8("heightSpin"))
|
||||
self.horizontalLayout_4.addWidget(self.heightSpin)
|
||||
self.gridLayout_2.addLayout(self.horizontalLayout_4, 2, 1, 1, 2)
|
||||
self.sizeLabel = QtGui.QLabel(self.centralwidget)
|
||||
self.sizeLabel.setText(_fromUtf8(""))
|
||||
self.sizeLabel.setObjectName(_fromUtf8("sizeLabel"))
|
||||
self.gridLayout_2.addWidget(self.sizeLabel, 2, 3, 1, 1)
|
||||
MainWindow.setCentralWidget(self.centralwidget)
|
||||
|
||||
self.retranslateUi(MainWindow)
|
||||
self.stack.setCurrentIndex(1)
|
||||
QtCore.QMetaObject.connectSlotsByName(MainWindow)
|
||||
|
||||
def retranslateUi(self, MainWindow):
|
||||
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
|
||||
self.downsampleCheck.setText(_translate("MainWindow", "Auto downsample", None))
|
||||
self.scaleCheck.setText(_translate("MainWindow", "Scale Data", None))
|
||||
self.rawRadio.setText(_translate("MainWindow", "RawImageWidget", None))
|
||||
self.gfxRadio.setText(_translate("MainWindow", "GraphicsView + ImageItem", None))
|
||||
self.rawGLRadio.setText(_translate("MainWindow", "RawGLImageWidget", None))
|
||||
self.dtypeCombo.setItemText(0, _translate("MainWindow", "uint8", None))
|
||||
self.dtypeCombo.setItemText(1, _translate("MainWindow", "uint16", None))
|
||||
self.dtypeCombo.setItemText(2, _translate("MainWindow", "float", None))
|
||||
self.label.setText(_translate("MainWindow", "Data type", None))
|
||||
self.rgbLevelsCheck.setText(_translate("MainWindow", "RGB", None))
|
||||
self.label_3.setText(_translate("MainWindow", "<--->", None))
|
||||
self.label_2.setText(_translate("MainWindow", "<--->", None))
|
||||
self.label_4.setText(_translate("MainWindow", "<--->", None))
|
||||
self.lutCheck.setText(_translate("MainWindow", "Use Lookup Table", None))
|
||||
self.alphaCheck.setText(_translate("MainWindow", "alpha", None))
|
||||
self.fpsLabel.setText(_translate("MainWindow", "FPS", None))
|
||||
self.rgbCheck.setText(_translate("MainWindow", "RGB", None))
|
||||
self.label_5.setText(_translate("MainWindow", "Image size", None))
|
||||
|
||||
from pyqtgraph import GradientWidget, GraphicsView, SpinBox
|
||||
from pyqtgraph.widgets.RawImageWidget import RawImageWidget
|
@ -2,12 +2,15 @@
|
||||
|
||||
# Form implementation generated from reading ui file 'examples/VideoTemplate.ui'
|
||||
#
|
||||
# Created by: PyQt5 UI code generator 5.5.1
|
||||
# Created by: PyQt5 UI code generator 5.15.1
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
||||
# run again. Do not edit this file unless you know what you are doing.
|
||||
|
||||
|
||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class Ui_MainWindow(object):
|
||||
def setupUi(self, MainWindow):
|
||||
MainWindow.setObjectName("MainWindow")
|
||||
@ -16,6 +19,9 @@ class Ui_MainWindow(object):
|
||||
self.centralwidget.setObjectName("centralwidget")
|
||||
self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget)
|
||||
self.gridLayout_2.setObjectName("gridLayout_2")
|
||||
self.cudaCheck = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.cudaCheck.setObjectName("cudaCheck")
|
||||
self.gridLayout_2.addWidget(self.cudaCheck, 9, 0, 1, 2)
|
||||
self.downsampleCheck = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.downsampleCheck.setObjectName("downsampleCheck")
|
||||
self.gridLayout_2.addWidget(self.downsampleCheck, 8, 0, 1, 2)
|
||||
@ -176,6 +182,7 @@ class Ui_MainWindow(object):
|
||||
def retranslateUi(self, MainWindow):
|
||||
_translate = QtCore.QCoreApplication.translate
|
||||
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
|
||||
self.cudaCheck.setText(_translate("MainWindow", "Use CUDA (GPU) if available"))
|
||||
self.downsampleCheck.setText(_translate("MainWindow", "Auto downsample"))
|
||||
self.scaleCheck.setText(_translate("MainWindow", "Scale Data"))
|
||||
self.rawRadio.setText(_translate("MainWindow", "RawImageWidget"))
|
||||
@ -194,6 +201,5 @@ class Ui_MainWindow(object):
|
||||
self.fpsLabel.setText(_translate("MainWindow", "FPS"))
|
||||
self.rgbCheck.setText(_translate("MainWindow", "RGB"))
|
||||
self.label_5.setText(_translate("MainWindow", "Image size"))
|
||||
|
||||
from pyqtgraph import GradientWidget, GraphicsView, SpinBox
|
||||
from pyqtgraph.widgets.RawImageWidget import RawImageWidget
|
||||
|
@ -1,53 +1,56 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Form implementation generated from reading ui file 'examples/VideoTemplate.ui'
|
||||
# Form implementation generated from reading ui file 'VideoTemplate.ui'
|
||||
#
|
||||
# Created: Wed Oct 26 09:21:01 2016
|
||||
# by: pyside-uic 0.2.15 running on PySide 1.2.2
|
||||
# Created by: PyQt6 UI code generator 6.0.0
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
|
||||
# run again. Do not edit this file unless you know what you are doing.
|
||||
|
||||
|
||||
from PyQt6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
from PySide import QtCore, QtGui
|
||||
|
||||
class Ui_MainWindow(object):
|
||||
def setupUi(self, MainWindow):
|
||||
MainWindow.setObjectName("MainWindow")
|
||||
MainWindow.resize(695, 798)
|
||||
self.centralwidget = QtGui.QWidget(MainWindow)
|
||||
self.centralwidget = QtWidgets.QWidget(MainWindow)
|
||||
self.centralwidget.setObjectName("centralwidget")
|
||||
self.gridLayout_2 = QtGui.QGridLayout(self.centralwidget)
|
||||
self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget)
|
||||
self.gridLayout_2.setObjectName("gridLayout_2")
|
||||
self.downsampleCheck = QtGui.QCheckBox(self.centralwidget)
|
||||
self.cudaCheck = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.cudaCheck.setObjectName("cudaCheck")
|
||||
self.gridLayout_2.addWidget(self.cudaCheck, 9, 0, 1, 2)
|
||||
self.downsampleCheck = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.downsampleCheck.setObjectName("downsampleCheck")
|
||||
self.gridLayout_2.addWidget(self.downsampleCheck, 8, 0, 1, 2)
|
||||
self.scaleCheck = QtGui.QCheckBox(self.centralwidget)
|
||||
self.scaleCheck = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.scaleCheck.setObjectName("scaleCheck")
|
||||
self.gridLayout_2.addWidget(self.scaleCheck, 4, 0, 1, 1)
|
||||
self.gridLayout = QtGui.QGridLayout()
|
||||
self.gridLayout = QtWidgets.QGridLayout()
|
||||
self.gridLayout.setObjectName("gridLayout")
|
||||
self.rawRadio = QtGui.QRadioButton(self.centralwidget)
|
||||
self.rawRadio = QtWidgets.QRadioButton(self.centralwidget)
|
||||
self.rawRadio.setObjectName("rawRadio")
|
||||
self.gridLayout.addWidget(self.rawRadio, 3, 0, 1, 1)
|
||||
self.gfxRadio = QtGui.QRadioButton(self.centralwidget)
|
||||
self.gfxRadio = QtWidgets.QRadioButton(self.centralwidget)
|
||||
self.gfxRadio.setChecked(True)
|
||||
self.gfxRadio.setObjectName("gfxRadio")
|
||||
self.gridLayout.addWidget(self.gfxRadio, 2, 0, 1, 1)
|
||||
self.stack = QtGui.QStackedWidget(self.centralwidget)
|
||||
self.stack = QtWidgets.QStackedWidget(self.centralwidget)
|
||||
self.stack.setObjectName("stack")
|
||||
self.page = QtGui.QWidget()
|
||||
self.page = QtWidgets.QWidget()
|
||||
self.page.setObjectName("page")
|
||||
self.gridLayout_3 = QtGui.QGridLayout(self.page)
|
||||
self.gridLayout_3 = QtWidgets.QGridLayout(self.page)
|
||||
self.gridLayout_3.setObjectName("gridLayout_3")
|
||||
self.graphicsView = GraphicsView(self.page)
|
||||
self.graphicsView.setObjectName("graphicsView")
|
||||
self.gridLayout_3.addWidget(self.graphicsView, 0, 0, 1, 1)
|
||||
self.stack.addWidget(self.page)
|
||||
self.page_2 = QtGui.QWidget()
|
||||
self.page_2 = QtWidgets.QWidget()
|
||||
self.page_2.setObjectName("page_2")
|
||||
self.gridLayout_4 = QtGui.QGridLayout(self.page_2)
|
||||
self.gridLayout_4 = QtWidgets.QGridLayout(self.page_2)
|
||||
self.gridLayout_4.setObjectName("gridLayout_4")
|
||||
self.rawImg = RawImageWidget(self.page_2)
|
||||
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.rawImg.sizePolicy().hasHeightForWidth())
|
||||
@ -56,30 +59,30 @@ class Ui_MainWindow(object):
|
||||
self.gridLayout_4.addWidget(self.rawImg, 0, 0, 1, 1)
|
||||
self.stack.addWidget(self.page_2)
|
||||
self.gridLayout.addWidget(self.stack, 0, 0, 1, 1)
|
||||
self.rawGLRadio = QtGui.QRadioButton(self.centralwidget)
|
||||
self.rawGLRadio = QtWidgets.QRadioButton(self.centralwidget)
|
||||
self.rawGLRadio.setObjectName("rawGLRadio")
|
||||
self.gridLayout.addWidget(self.rawGLRadio, 4, 0, 1, 1)
|
||||
self.gridLayout_2.addLayout(self.gridLayout, 1, 0, 1, 4)
|
||||
self.dtypeCombo = QtGui.QComboBox(self.centralwidget)
|
||||
self.dtypeCombo = QtWidgets.QComboBox(self.centralwidget)
|
||||
self.dtypeCombo.setObjectName("dtypeCombo")
|
||||
self.dtypeCombo.addItem("")
|
||||
self.dtypeCombo.addItem("")
|
||||
self.dtypeCombo.addItem("")
|
||||
self.gridLayout_2.addWidget(self.dtypeCombo, 3, 2, 1, 1)
|
||||
self.label = QtGui.QLabel(self.centralwidget)
|
||||
self.label = QtWidgets.QLabel(self.centralwidget)
|
||||
self.label.setObjectName("label")
|
||||
self.gridLayout_2.addWidget(self.label, 3, 0, 1, 1)
|
||||
self.rgbLevelsCheck = QtGui.QCheckBox(self.centralwidget)
|
||||
self.rgbLevelsCheck = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.rgbLevelsCheck.setObjectName("rgbLevelsCheck")
|
||||
self.gridLayout_2.addWidget(self.rgbLevelsCheck, 4, 1, 1, 1)
|
||||
self.horizontalLayout_2 = QtGui.QHBoxLayout()
|
||||
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
|
||||
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
||||
self.minSpin2 = SpinBox(self.centralwidget)
|
||||
self.minSpin2.setEnabled(False)
|
||||
self.minSpin2.setObjectName("minSpin2")
|
||||
self.horizontalLayout_2.addWidget(self.minSpin2)
|
||||
self.label_3 = QtGui.QLabel(self.centralwidget)
|
||||
self.label_3.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.label_3 = QtWidgets.QLabel(self.centralwidget)
|
||||
self.label_3.setAlignment(QtCore.Qt.Alignment.AlignCenter)
|
||||
self.label_3.setObjectName("label_3")
|
||||
self.horizontalLayout_2.addWidget(self.label_3)
|
||||
self.maxSpin2 = SpinBox(self.centralwidget)
|
||||
@ -87,27 +90,27 @@ class Ui_MainWindow(object):
|
||||
self.maxSpin2.setObjectName("maxSpin2")
|
||||
self.horizontalLayout_2.addWidget(self.maxSpin2)
|
||||
self.gridLayout_2.addLayout(self.horizontalLayout_2, 5, 2, 1, 1)
|
||||
self.horizontalLayout = QtGui.QHBoxLayout()
|
||||
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
||||
self.minSpin1 = SpinBox(self.centralwidget)
|
||||
self.minSpin1.setObjectName("minSpin1")
|
||||
self.horizontalLayout.addWidget(self.minSpin1)
|
||||
self.label_2 = QtGui.QLabel(self.centralwidget)
|
||||
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.label_2 = QtWidgets.QLabel(self.centralwidget)
|
||||
self.label_2.setAlignment(QtCore.Qt.Alignment.AlignCenter)
|
||||
self.label_2.setObjectName("label_2")
|
||||
self.horizontalLayout.addWidget(self.label_2)
|
||||
self.maxSpin1 = SpinBox(self.centralwidget)
|
||||
self.maxSpin1.setObjectName("maxSpin1")
|
||||
self.horizontalLayout.addWidget(self.maxSpin1)
|
||||
self.gridLayout_2.addLayout(self.horizontalLayout, 4, 2, 1, 1)
|
||||
self.horizontalLayout_3 = QtGui.QHBoxLayout()
|
||||
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
|
||||
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
|
||||
self.minSpin3 = SpinBox(self.centralwidget)
|
||||
self.minSpin3.setEnabled(False)
|
||||
self.minSpin3.setObjectName("minSpin3")
|
||||
self.horizontalLayout_3.addWidget(self.minSpin3)
|
||||
self.label_4 = QtGui.QLabel(self.centralwidget)
|
||||
self.label_4.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.label_4 = QtWidgets.QLabel(self.centralwidget)
|
||||
self.label_4.setAlignment(QtCore.Qt.Alignment.AlignCenter)
|
||||
self.label_4.setObjectName("label_4")
|
||||
self.horizontalLayout_3.addWidget(self.label_4)
|
||||
self.maxSpin3 = SpinBox(self.centralwidget)
|
||||
@ -115,56 +118,56 @@ class Ui_MainWindow(object):
|
||||
self.maxSpin3.setObjectName("maxSpin3")
|
||||
self.horizontalLayout_3.addWidget(self.maxSpin3)
|
||||
self.gridLayout_2.addLayout(self.horizontalLayout_3, 6, 2, 1, 1)
|
||||
self.lutCheck = QtGui.QCheckBox(self.centralwidget)
|
||||
self.lutCheck = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.lutCheck.setObjectName("lutCheck")
|
||||
self.gridLayout_2.addWidget(self.lutCheck, 7, 0, 1, 1)
|
||||
self.alphaCheck = QtGui.QCheckBox(self.centralwidget)
|
||||
self.alphaCheck = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.alphaCheck.setObjectName("alphaCheck")
|
||||
self.gridLayout_2.addWidget(self.alphaCheck, 7, 1, 1, 1)
|
||||
self.gradient = GradientWidget(self.centralwidget)
|
||||
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.gradient.sizePolicy().hasHeightForWidth())
|
||||
self.gradient.setSizePolicy(sizePolicy)
|
||||
self.gradient.setObjectName("gradient")
|
||||
self.gridLayout_2.addWidget(self.gradient, 7, 2, 1, 2)
|
||||
spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
|
||||
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
|
||||
self.gridLayout_2.addItem(spacerItem, 3, 3, 1, 1)
|
||||
self.fpsLabel = QtGui.QLabel(self.centralwidget)
|
||||
self.fpsLabel = QtWidgets.QLabel(self.centralwidget)
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(12)
|
||||
self.fpsLabel.setFont(font)
|
||||
self.fpsLabel.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.fpsLabel.setAlignment(QtCore.Qt.Alignment.AlignCenter)
|
||||
self.fpsLabel.setObjectName("fpsLabel")
|
||||
self.gridLayout_2.addWidget(self.fpsLabel, 0, 0, 1, 4)
|
||||
self.rgbCheck = QtGui.QCheckBox(self.centralwidget)
|
||||
self.rgbCheck = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.rgbCheck.setObjectName("rgbCheck")
|
||||
self.gridLayout_2.addWidget(self.rgbCheck, 3, 1, 1, 1)
|
||||
self.label_5 = QtGui.QLabel(self.centralwidget)
|
||||
self.label_5 = QtWidgets.QLabel(self.centralwidget)
|
||||
self.label_5.setObjectName("label_5")
|
||||
self.gridLayout_2.addWidget(self.label_5, 2, 0, 1, 1)
|
||||
self.horizontalLayout_4 = QtGui.QHBoxLayout()
|
||||
self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
|
||||
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
|
||||
self.framesSpin = QtGui.QSpinBox(self.centralwidget)
|
||||
self.framesSpin.setButtonSymbols(QtGui.QAbstractSpinBox.NoButtons)
|
||||
self.framesSpin = QtWidgets.QSpinBox(self.centralwidget)
|
||||
self.framesSpin.setButtonSymbols(QtWidgets.QAbstractSpinBox.ButtonSymbols.NoButtons)
|
||||
self.framesSpin.setProperty("value", 10)
|
||||
self.framesSpin.setObjectName("framesSpin")
|
||||
self.horizontalLayout_4.addWidget(self.framesSpin)
|
||||
self.widthSpin = QtGui.QSpinBox(self.centralwidget)
|
||||
self.widthSpin.setButtonSymbols(QtGui.QAbstractSpinBox.PlusMinus)
|
||||
self.widthSpin = QtWidgets.QSpinBox(self.centralwidget)
|
||||
self.widthSpin.setButtonSymbols(QtWidgets.QAbstractSpinBox.ButtonSymbols.PlusMinus)
|
||||
self.widthSpin.setMaximum(10000)
|
||||
self.widthSpin.setProperty("value", 512)
|
||||
self.widthSpin.setObjectName("widthSpin")
|
||||
self.horizontalLayout_4.addWidget(self.widthSpin)
|
||||
self.heightSpin = QtGui.QSpinBox(self.centralwidget)
|
||||
self.heightSpin.setButtonSymbols(QtGui.QAbstractSpinBox.NoButtons)
|
||||
self.heightSpin = QtWidgets.QSpinBox(self.centralwidget)
|
||||
self.heightSpin.setButtonSymbols(QtWidgets.QAbstractSpinBox.ButtonSymbols.NoButtons)
|
||||
self.heightSpin.setMaximum(10000)
|
||||
self.heightSpin.setProperty("value", 512)
|
||||
self.heightSpin.setObjectName("heightSpin")
|
||||
self.horizontalLayout_4.addWidget(self.heightSpin)
|
||||
self.gridLayout_2.addLayout(self.horizontalLayout_4, 2, 1, 1, 2)
|
||||
self.sizeLabel = QtGui.QLabel(self.centralwidget)
|
||||
self.sizeLabel = QtWidgets.QLabel(self.centralwidget)
|
||||
self.sizeLabel.setText("")
|
||||
self.sizeLabel.setObjectName("sizeLabel")
|
||||
self.gridLayout_2.addWidget(self.sizeLabel, 2, 3, 1, 1)
|
||||
@ -175,25 +178,26 @@ class Ui_MainWindow(object):
|
||||
QtCore.QMetaObject.connectSlotsByName(MainWindow)
|
||||
|
||||
def retranslateUi(self, MainWindow):
|
||||
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.downsampleCheck.setText(QtGui.QApplication.translate("MainWindow", "Auto downsample", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.scaleCheck.setText(QtGui.QApplication.translate("MainWindow", "Scale Data", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.rawRadio.setText(QtGui.QApplication.translate("MainWindow", "RawImageWidget", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.gfxRadio.setText(QtGui.QApplication.translate("MainWindow", "GraphicsView + ImageItem", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.rawGLRadio.setText(QtGui.QApplication.translate("MainWindow", "RawGLImageWidget", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.dtypeCombo.setItemText(0, QtGui.QApplication.translate("MainWindow", "uint8", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.dtypeCombo.setItemText(1, QtGui.QApplication.translate("MainWindow", "uint16", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.dtypeCombo.setItemText(2, QtGui.QApplication.translate("MainWindow", "float", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label.setText(QtGui.QApplication.translate("MainWindow", "Data type", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.rgbLevelsCheck.setText(QtGui.QApplication.translate("MainWindow", "RGB", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_3.setText(QtGui.QApplication.translate("MainWindow", "<--->", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_2.setText(QtGui.QApplication.translate("MainWindow", "<--->", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_4.setText(QtGui.QApplication.translate("MainWindow", "<--->", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.lutCheck.setText(QtGui.QApplication.translate("MainWindow", "Use Lookup Table", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.alphaCheck.setText(QtGui.QApplication.translate("MainWindow", "alpha", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.fpsLabel.setText(QtGui.QApplication.translate("MainWindow", "FPS", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.rgbCheck.setText(QtGui.QApplication.translate("MainWindow", "RGB", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_5.setText(QtGui.QApplication.translate("MainWindow", "Image size", None, QtGui.QApplication.UnicodeUTF8))
|
||||
|
||||
_translate = QtCore.QCoreApplication.translate
|
||||
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
|
||||
self.cudaCheck.setText(_translate("MainWindow", "Use CUDA (GPU) if available"))
|
||||
self.downsampleCheck.setText(_translate("MainWindow", "Auto downsample"))
|
||||
self.scaleCheck.setText(_translate("MainWindow", "Scale Data"))
|
||||
self.rawRadio.setText(_translate("MainWindow", "RawImageWidget"))
|
||||
self.gfxRadio.setText(_translate("MainWindow", "GraphicsView + ImageItem"))
|
||||
self.rawGLRadio.setText(_translate("MainWindow", "RawGLImageWidget"))
|
||||
self.dtypeCombo.setItemText(0, _translate("MainWindow", "uint8"))
|
||||
self.dtypeCombo.setItemText(1, _translate("MainWindow", "uint16"))
|
||||
self.dtypeCombo.setItemText(2, _translate("MainWindow", "float"))
|
||||
self.label.setText(_translate("MainWindow", "Data type"))
|
||||
self.rgbLevelsCheck.setText(_translate("MainWindow", "RGB"))
|
||||
self.label_3.setText(_translate("MainWindow", "<--->"))
|
||||
self.label_2.setText(_translate("MainWindow", "<--->"))
|
||||
self.label_4.setText(_translate("MainWindow", "<--->"))
|
||||
self.lutCheck.setText(_translate("MainWindow", "Use Lookup Table"))
|
||||
self.alphaCheck.setText(_translate("MainWindow", "alpha"))
|
||||
self.fpsLabel.setText(_translate("MainWindow", "FPS"))
|
||||
self.rgbCheck.setText(_translate("MainWindow", "RGB"))
|
||||
self.label_5.setText(_translate("MainWindow", "Image size"))
|
||||
from pyqtgraph import GradientWidget, GraphicsView, SpinBox
|
||||
from pyqtgraph.widgets.RawImageWidget import RawImageWidget
|
||||
from pyqtgraph import SpinBox, GradientWidget, GraphicsView
|
@ -1,207 +1,288 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Form implementation generated from reading ui file 'VideoTemplate.ui'
|
||||
#
|
||||
# Created: Sun Sep 18 19:22:41 2016
|
||||
# by: pyside2-uic running on PySide2 2.0.0~alpha0
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
################################################################################
|
||||
## Form generated from reading UI file 'VideoTemplate.ui'
|
||||
##
|
||||
## Created by: Qt User Interface Compiler version 5.15.2
|
||||
##
|
||||
## WARNING! All changes made in this file will be lost when recompiling UI file!
|
||||
################################################################################
|
||||
|
||||
from PySide2.QtCore import *
|
||||
from PySide2.QtGui import *
|
||||
from PySide2.QtWidgets import *
|
||||
|
||||
from pyqtgraph import GraphicsView
|
||||
from pyqtgraph.widgets.RawImageWidget import RawImageWidget
|
||||
from pyqtgraph import GradientWidget
|
||||
from pyqtgraph import SpinBox
|
||||
|
||||
from PySide2 import QtCore, QtGui, QtWidgets
|
||||
|
||||
class Ui_MainWindow(object):
|
||||
def setupUi(self, MainWindow):
|
||||
MainWindow.setObjectName("MainWindow")
|
||||
if not MainWindow.objectName():
|
||||
MainWindow.setObjectName(u"MainWindow")
|
||||
MainWindow.resize(695, 798)
|
||||
self.centralwidget = QtWidgets.QWidget(MainWindow)
|
||||
self.centralwidget.setObjectName("centralwidget")
|
||||
self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget)
|
||||
self.gridLayout_2.setObjectName("gridLayout_2")
|
||||
self.downsampleCheck = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.downsampleCheck.setObjectName("downsampleCheck")
|
||||
self.centralwidget = QWidget(MainWindow)
|
||||
self.centralwidget.setObjectName(u"centralwidget")
|
||||
self.gridLayout_2 = QGridLayout(self.centralwidget)
|
||||
self.gridLayout_2.setObjectName(u"gridLayout_2")
|
||||
self.cudaCheck = QCheckBox(self.centralwidget)
|
||||
self.cudaCheck.setObjectName(u"cudaCheck")
|
||||
|
||||
self.gridLayout_2.addWidget(self.cudaCheck, 9, 0, 1, 2)
|
||||
|
||||
self.downsampleCheck = QCheckBox(self.centralwidget)
|
||||
self.downsampleCheck.setObjectName(u"downsampleCheck")
|
||||
|
||||
self.gridLayout_2.addWidget(self.downsampleCheck, 8, 0, 1, 2)
|
||||
self.scaleCheck = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.scaleCheck.setObjectName("scaleCheck")
|
||||
|
||||
self.scaleCheck = QCheckBox(self.centralwidget)
|
||||
self.scaleCheck.setObjectName(u"scaleCheck")
|
||||
|
||||
self.gridLayout_2.addWidget(self.scaleCheck, 4, 0, 1, 1)
|
||||
self.gridLayout = QtWidgets.QGridLayout()
|
||||
self.gridLayout.setObjectName("gridLayout")
|
||||
self.rawRadio = QtWidgets.QRadioButton(self.centralwidget)
|
||||
self.rawRadio.setObjectName("rawRadio")
|
||||
|
||||
self.gridLayout = QGridLayout()
|
||||
self.gridLayout.setObjectName(u"gridLayout")
|
||||
self.rawRadio = QRadioButton(self.centralwidget)
|
||||
self.rawRadio.setObjectName(u"rawRadio")
|
||||
|
||||
self.gridLayout.addWidget(self.rawRadio, 3, 0, 1, 1)
|
||||
self.gfxRadio = QtWidgets.QRadioButton(self.centralwidget)
|
||||
|
||||
self.gfxRadio = QRadioButton(self.centralwidget)
|
||||
self.gfxRadio.setObjectName(u"gfxRadio")
|
||||
self.gfxRadio.setChecked(True)
|
||||
self.gfxRadio.setObjectName("gfxRadio")
|
||||
|
||||
self.gridLayout.addWidget(self.gfxRadio, 2, 0, 1, 1)
|
||||
self.stack = QtWidgets.QStackedWidget(self.centralwidget)
|
||||
self.stack.setObjectName("stack")
|
||||
self.page = QtWidgets.QWidget()
|
||||
self.page.setObjectName("page")
|
||||
self.gridLayout_3 = QtWidgets.QGridLayout(self.page)
|
||||
self.gridLayout_3.setObjectName("gridLayout_3")
|
||||
|
||||
self.stack = QStackedWidget(self.centralwidget)
|
||||
self.stack.setObjectName(u"stack")
|
||||
self.page = QWidget()
|
||||
self.page.setObjectName(u"page")
|
||||
self.gridLayout_3 = QGridLayout(self.page)
|
||||
self.gridLayout_3.setObjectName(u"gridLayout_3")
|
||||
self.graphicsView = GraphicsView(self.page)
|
||||
self.graphicsView.setObjectName("graphicsView")
|
||||
self.graphicsView.setObjectName(u"graphicsView")
|
||||
|
||||
self.gridLayout_3.addWidget(self.graphicsView, 0, 0, 1, 1)
|
||||
|
||||
self.stack.addWidget(self.page)
|
||||
self.page_2 = QtWidgets.QWidget()
|
||||
self.page_2.setObjectName("page_2")
|
||||
self.gridLayout_4 = QtWidgets.QGridLayout(self.page_2)
|
||||
self.gridLayout_4.setObjectName("gridLayout_4")
|
||||
self.page_2 = QWidget()
|
||||
self.page_2.setObjectName(u"page_2")
|
||||
self.gridLayout_4 = QGridLayout(self.page_2)
|
||||
self.gridLayout_4.setObjectName(u"gridLayout_4")
|
||||
self.rawImg = RawImageWidget(self.page_2)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
|
||||
self.rawImg.setObjectName(u"rawImg")
|
||||
sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.rawImg.sizePolicy().hasHeightForWidth())
|
||||
self.rawImg.setSizePolicy(sizePolicy)
|
||||
self.rawImg.setObjectName("rawImg")
|
||||
|
||||
self.gridLayout_4.addWidget(self.rawImg, 0, 0, 1, 1)
|
||||
|
||||
self.stack.addWidget(self.page_2)
|
||||
self.page_3 = QtWidgets.QWidget()
|
||||
self.page_3.setObjectName("page_3")
|
||||
self.gridLayout_5 = QtWidgets.QGridLayout(self.page_3)
|
||||
self.gridLayout_5.setObjectName("gridLayout_5")
|
||||
self.rawGLImg = RawImageGLWidget(self.page_3)
|
||||
self.rawGLImg.setObjectName("rawGLImg")
|
||||
self.gridLayout_5.addWidget(self.rawGLImg, 0, 0, 1, 1)
|
||||
self.stack.addWidget(self.page_3)
|
||||
|
||||
self.gridLayout.addWidget(self.stack, 0, 0, 1, 1)
|
||||
self.rawGLRadio = QtWidgets.QRadioButton(self.centralwidget)
|
||||
self.rawGLRadio.setObjectName("rawGLRadio")
|
||||
|
||||
self.rawGLRadio = QRadioButton(self.centralwidget)
|
||||
self.rawGLRadio.setObjectName(u"rawGLRadio")
|
||||
|
||||
self.gridLayout.addWidget(self.rawGLRadio, 4, 0, 1, 1)
|
||||
|
||||
|
||||
self.gridLayout_2.addLayout(self.gridLayout, 1, 0, 1, 4)
|
||||
self.dtypeCombo = QtWidgets.QComboBox(self.centralwidget)
|
||||
self.dtypeCombo.setObjectName("dtypeCombo")
|
||||
|
||||
self.dtypeCombo = QComboBox(self.centralwidget)
|
||||
self.dtypeCombo.addItem("")
|
||||
self.dtypeCombo.addItem("")
|
||||
self.dtypeCombo.addItem("")
|
||||
self.dtypeCombo.setObjectName(u"dtypeCombo")
|
||||
|
||||
self.gridLayout_2.addWidget(self.dtypeCombo, 3, 2, 1, 1)
|
||||
self.label = QtWidgets.QLabel(self.centralwidget)
|
||||
self.label.setObjectName("label")
|
||||
|
||||
self.label = QLabel(self.centralwidget)
|
||||
self.label.setObjectName(u"label")
|
||||
|
||||
self.gridLayout_2.addWidget(self.label, 3, 0, 1, 1)
|
||||
self.rgbLevelsCheck = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.rgbLevelsCheck.setObjectName("rgbLevelsCheck")
|
||||
|
||||
self.rgbLevelsCheck = QCheckBox(self.centralwidget)
|
||||
self.rgbLevelsCheck.setObjectName(u"rgbLevelsCheck")
|
||||
|
||||
self.gridLayout_2.addWidget(self.rgbLevelsCheck, 4, 1, 1, 1)
|
||||
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
|
||||
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
||||
|
||||
self.horizontalLayout_2 = QHBoxLayout()
|
||||
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
|
||||
self.minSpin2 = SpinBox(self.centralwidget)
|
||||
self.minSpin2.setObjectName(u"minSpin2")
|
||||
self.minSpin2.setEnabled(False)
|
||||
self.minSpin2.setObjectName("minSpin2")
|
||||
|
||||
self.horizontalLayout_2.addWidget(self.minSpin2)
|
||||
self.label_3 = QtWidgets.QLabel(self.centralwidget)
|
||||
self.label_3.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.label_3.setObjectName("label_3")
|
||||
|
||||
self.label_3 = QLabel(self.centralwidget)
|
||||
self.label_3.setObjectName(u"label_3")
|
||||
self.label_3.setAlignment(Qt.AlignCenter)
|
||||
|
||||
self.horizontalLayout_2.addWidget(self.label_3)
|
||||
|
||||
self.maxSpin2 = SpinBox(self.centralwidget)
|
||||
self.maxSpin2.setObjectName(u"maxSpin2")
|
||||
self.maxSpin2.setEnabled(False)
|
||||
self.maxSpin2.setObjectName("maxSpin2")
|
||||
|
||||
self.horizontalLayout_2.addWidget(self.maxSpin2)
|
||||
|
||||
|
||||
self.gridLayout_2.addLayout(self.horizontalLayout_2, 5, 2, 1, 1)
|
||||
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
||||
|
||||
self.horizontalLayout = QHBoxLayout()
|
||||
self.horizontalLayout.setObjectName(u"horizontalLayout")
|
||||
self.minSpin1 = SpinBox(self.centralwidget)
|
||||
self.minSpin1.setObjectName("minSpin1")
|
||||
self.minSpin1.setObjectName(u"minSpin1")
|
||||
|
||||
self.horizontalLayout.addWidget(self.minSpin1)
|
||||
self.label_2 = QtWidgets.QLabel(self.centralwidget)
|
||||
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.label_2.setObjectName("label_2")
|
||||
|
||||
self.label_2 = QLabel(self.centralwidget)
|
||||
self.label_2.setObjectName(u"label_2")
|
||||
self.label_2.setAlignment(Qt.AlignCenter)
|
||||
|
||||
self.horizontalLayout.addWidget(self.label_2)
|
||||
|
||||
self.maxSpin1 = SpinBox(self.centralwidget)
|
||||
self.maxSpin1.setObjectName("maxSpin1")
|
||||
self.maxSpin1.setObjectName(u"maxSpin1")
|
||||
|
||||
self.horizontalLayout.addWidget(self.maxSpin1)
|
||||
|
||||
|
||||
self.gridLayout_2.addLayout(self.horizontalLayout, 4, 2, 1, 1)
|
||||
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
|
||||
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
|
||||
|
||||
self.horizontalLayout_3 = QHBoxLayout()
|
||||
self.horizontalLayout_3.setObjectName(u"horizontalLayout_3")
|
||||
self.minSpin3 = SpinBox(self.centralwidget)
|
||||
self.minSpin3.setObjectName(u"minSpin3")
|
||||
self.minSpin3.setEnabled(False)
|
||||
self.minSpin3.setObjectName("minSpin3")
|
||||
|
||||
self.horizontalLayout_3.addWidget(self.minSpin3)
|
||||
self.label_4 = QtWidgets.QLabel(self.centralwidget)
|
||||
self.label_4.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.label_4.setObjectName("label_4")
|
||||
|
||||
self.label_4 = QLabel(self.centralwidget)
|
||||
self.label_4.setObjectName(u"label_4")
|
||||
self.label_4.setAlignment(Qt.AlignCenter)
|
||||
|
||||
self.horizontalLayout_3.addWidget(self.label_4)
|
||||
|
||||
self.maxSpin3 = SpinBox(self.centralwidget)
|
||||
self.maxSpin3.setObjectName(u"maxSpin3")
|
||||
self.maxSpin3.setEnabled(False)
|
||||
self.maxSpin3.setObjectName("maxSpin3")
|
||||
|
||||
self.horizontalLayout_3.addWidget(self.maxSpin3)
|
||||
|
||||
|
||||
self.gridLayout_2.addLayout(self.horizontalLayout_3, 6, 2, 1, 1)
|
||||
self.lutCheck = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.lutCheck.setObjectName("lutCheck")
|
||||
|
||||
self.lutCheck = QCheckBox(self.centralwidget)
|
||||
self.lutCheck.setObjectName(u"lutCheck")
|
||||
|
||||
self.gridLayout_2.addWidget(self.lutCheck, 7, 0, 1, 1)
|
||||
self.alphaCheck = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.alphaCheck.setObjectName("alphaCheck")
|
||||
|
||||
self.alphaCheck = QCheckBox(self.centralwidget)
|
||||
self.alphaCheck.setObjectName(u"alphaCheck")
|
||||
|
||||
self.gridLayout_2.addWidget(self.alphaCheck, 7, 1, 1, 1)
|
||||
|
||||
self.gradient = GradientWidget(self.centralwidget)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
self.gradient.setObjectName(u"gradient")
|
||||
sizePolicy.setHeightForWidth(self.gradient.sizePolicy().hasHeightForWidth())
|
||||
self.gradient.setSizePolicy(sizePolicy)
|
||||
self.gradient.setObjectName("gradient")
|
||||
|
||||
self.gridLayout_2.addWidget(self.gradient, 7, 2, 1, 2)
|
||||
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
||||
self.gridLayout_2.addItem(spacerItem, 3, 3, 1, 1)
|
||||
self.fpsLabel = QtWidgets.QLabel(self.centralwidget)
|
||||
font = QtGui.QFont()
|
||||
|
||||
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
|
||||
|
||||
self.gridLayout_2.addItem(self.horizontalSpacer, 3, 3, 1, 1)
|
||||
|
||||
self.fpsLabel = QLabel(self.centralwidget)
|
||||
self.fpsLabel.setObjectName(u"fpsLabel")
|
||||
font = QFont()
|
||||
font.setPointSize(12)
|
||||
self.fpsLabel.setFont(font)
|
||||
self.fpsLabel.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.fpsLabel.setObjectName("fpsLabel")
|
||||
self.fpsLabel.setAlignment(Qt.AlignCenter)
|
||||
|
||||
self.gridLayout_2.addWidget(self.fpsLabel, 0, 0, 1, 4)
|
||||
self.rgbCheck = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.rgbCheck.setObjectName("rgbCheck")
|
||||
|
||||
self.rgbCheck = QCheckBox(self.centralwidget)
|
||||
self.rgbCheck.setObjectName(u"rgbCheck")
|
||||
|
||||
self.gridLayout_2.addWidget(self.rgbCheck, 3, 1, 1, 1)
|
||||
self.label_5 = QtWidgets.QLabel(self.centralwidget)
|
||||
self.label_5.setObjectName("label_5")
|
||||
|
||||
self.label_5 = QLabel(self.centralwidget)
|
||||
self.label_5.setObjectName(u"label_5")
|
||||
|
||||
self.gridLayout_2.addWidget(self.label_5, 2, 0, 1, 1)
|
||||
self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
|
||||
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
|
||||
self.framesSpin = QtWidgets.QSpinBox(self.centralwidget)
|
||||
self.framesSpin.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
|
||||
self.framesSpin.setProperty("value", 10)
|
||||
self.framesSpin.setObjectName("framesSpin")
|
||||
|
||||
self.horizontalLayout_4 = QHBoxLayout()
|
||||
self.horizontalLayout_4.setObjectName(u"horizontalLayout_4")
|
||||
self.framesSpin = QSpinBox(self.centralwidget)
|
||||
self.framesSpin.setObjectName(u"framesSpin")
|
||||
self.framesSpin.setButtonSymbols(QAbstractSpinBox.NoButtons)
|
||||
self.framesSpin.setValue(10)
|
||||
|
||||
self.horizontalLayout_4.addWidget(self.framesSpin)
|
||||
self.widthSpin = QtWidgets.QSpinBox(self.centralwidget)
|
||||
self.widthSpin.setButtonSymbols(QtWidgets.QAbstractSpinBox.PlusMinus)
|
||||
|
||||
self.widthSpin = QSpinBox(self.centralwidget)
|
||||
self.widthSpin.setObjectName(u"widthSpin")
|
||||
self.widthSpin.setButtonSymbols(QAbstractSpinBox.PlusMinus)
|
||||
self.widthSpin.setMaximum(10000)
|
||||
self.widthSpin.setProperty("value", 512)
|
||||
self.widthSpin.setObjectName("widthSpin")
|
||||
self.widthSpin.setValue(512)
|
||||
|
||||
self.horizontalLayout_4.addWidget(self.widthSpin)
|
||||
self.heightSpin = QtWidgets.QSpinBox(self.centralwidget)
|
||||
self.heightSpin.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
|
||||
|
||||
self.heightSpin = QSpinBox(self.centralwidget)
|
||||
self.heightSpin.setObjectName(u"heightSpin")
|
||||
self.heightSpin.setButtonSymbols(QAbstractSpinBox.NoButtons)
|
||||
self.heightSpin.setMaximum(10000)
|
||||
self.heightSpin.setProperty("value", 512)
|
||||
self.heightSpin.setObjectName("heightSpin")
|
||||
self.heightSpin.setValue(512)
|
||||
|
||||
self.horizontalLayout_4.addWidget(self.heightSpin)
|
||||
|
||||
|
||||
self.gridLayout_2.addLayout(self.horizontalLayout_4, 2, 1, 1, 2)
|
||||
self.sizeLabel = QtWidgets.QLabel(self.centralwidget)
|
||||
self.sizeLabel.setText("")
|
||||
self.sizeLabel.setObjectName("sizeLabel")
|
||||
|
||||
self.sizeLabel = QLabel(self.centralwidget)
|
||||
self.sizeLabel.setObjectName(u"sizeLabel")
|
||||
|
||||
self.gridLayout_2.addWidget(self.sizeLabel, 2, 3, 1, 1)
|
||||
|
||||
MainWindow.setCentralWidget(self.centralwidget)
|
||||
|
||||
self.retranslateUi(MainWindow)
|
||||
self.stack.setCurrentIndex(2)
|
||||
QtCore.QMetaObject.connectSlotsByName(MainWindow)
|
||||
|
||||
self.stack.setCurrentIndex(1)
|
||||
|
||||
|
||||
QMetaObject.connectSlotsByName(MainWindow)
|
||||
# setupUi
|
||||
|
||||
def retranslateUi(self, MainWindow):
|
||||
MainWindow.setWindowTitle(QtWidgets.QApplication.translate("MainWindow", "MainWindow", None, -1))
|
||||
self.downsampleCheck.setText(QtWidgets.QApplication.translate("MainWindow", "Auto downsample", None, -1))
|
||||
self.scaleCheck.setText(QtWidgets.QApplication.translate("MainWindow", "Scale Data", None, -1))
|
||||
self.rawRadio.setText(QtWidgets.QApplication.translate("MainWindow", "RawImageWidget", None, -1))
|
||||
self.gfxRadio.setText(QtWidgets.QApplication.translate("MainWindow", "GraphicsView + ImageItem", None, -1))
|
||||
self.rawGLRadio.setText(QtWidgets.QApplication.translate("MainWindow", "RawGLImageWidget", None, -1))
|
||||
self.dtypeCombo.setItemText(0, QtWidgets.QApplication.translate("MainWindow", "uint8", None, -1))
|
||||
self.dtypeCombo.setItemText(1, QtWidgets.QApplication.translate("MainWindow", "uint16", None, -1))
|
||||
self.dtypeCombo.setItemText(2, QtWidgets.QApplication.translate("MainWindow", "float", None, -1))
|
||||
self.label.setText(QtWidgets.QApplication.translate("MainWindow", "Data type", None, -1))
|
||||
self.rgbLevelsCheck.setText(QtWidgets.QApplication.translate("MainWindow", "RGB", None, -1))
|
||||
self.label_3.setText(QtWidgets.QApplication.translate("MainWindow", "<--->", None, -1))
|
||||
self.label_2.setText(QtWidgets.QApplication.translate("MainWindow", "<--->", None, -1))
|
||||
self.label_4.setText(QtWidgets.QApplication.translate("MainWindow", "<--->", None, -1))
|
||||
self.lutCheck.setText(QtWidgets.QApplication.translate("MainWindow", "Use Lookup Table", None, -1))
|
||||
self.alphaCheck.setText(QtWidgets.QApplication.translate("MainWindow", "alpha", None, -1))
|
||||
self.fpsLabel.setText(QtWidgets.QApplication.translate("MainWindow", "FPS", None, -1))
|
||||
self.rgbCheck.setText(QtWidgets.QApplication.translate("MainWindow", "RGB", None, -1))
|
||||
self.label_5.setText(QtWidgets.QApplication.translate("MainWindow", "Image size", None, -1))
|
||||
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
|
||||
self.cudaCheck.setText(QCoreApplication.translate("MainWindow", u"Use CUDA (GPU) if available", None))
|
||||
self.downsampleCheck.setText(QCoreApplication.translate("MainWindow", u"Auto downsample", None))
|
||||
self.scaleCheck.setText(QCoreApplication.translate("MainWindow", u"Scale Data", None))
|
||||
self.rawRadio.setText(QCoreApplication.translate("MainWindow", u"RawImageWidget", None))
|
||||
self.gfxRadio.setText(QCoreApplication.translate("MainWindow", u"GraphicsView + ImageItem", None))
|
||||
self.rawGLRadio.setText(QCoreApplication.translate("MainWindow", u"RawGLImageWidget", None))
|
||||
self.dtypeCombo.setItemText(0, QCoreApplication.translate("MainWindow", u"uint8", None))
|
||||
self.dtypeCombo.setItemText(1, QCoreApplication.translate("MainWindow", u"uint16", None))
|
||||
self.dtypeCombo.setItemText(2, QCoreApplication.translate("MainWindow", u"float", None))
|
||||
|
||||
self.label.setText(QCoreApplication.translate("MainWindow", u"Data type", None))
|
||||
self.rgbLevelsCheck.setText(QCoreApplication.translate("MainWindow", u"RGB", None))
|
||||
self.label_3.setText(QCoreApplication.translate("MainWindow", u"<--->", None))
|
||||
self.label_2.setText(QCoreApplication.translate("MainWindow", u"<--->", None))
|
||||
self.label_4.setText(QCoreApplication.translate("MainWindow", u"<--->", None))
|
||||
self.lutCheck.setText(QCoreApplication.translate("MainWindow", u"Use Lookup Table", None))
|
||||
self.alphaCheck.setText(QCoreApplication.translate("MainWindow", u"alpha", None))
|
||||
self.fpsLabel.setText(QCoreApplication.translate("MainWindow", u"FPS", None))
|
||||
self.rgbCheck.setText(QCoreApplication.translate("MainWindow", u"RGB", None))
|
||||
self.label_5.setText(QCoreApplication.translate("MainWindow", u"Image size", None))
|
||||
self.sizeLabel.setText("")
|
||||
# retranslateUi
|
||||
|
||||
from pyqtgraph.widgets.RawImageWidget import RawImageGLWidget, RawImageWidget
|
||||
from pyqtgraph import GradientWidget, SpinBox, GraphicsView
|
||||
|
288
examples/VideoTemplate_pyside6.py
Normal file
288
examples/VideoTemplate_pyside6.py
Normal file
@ -0,0 +1,288 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
################################################################################
|
||||
## Form generated from reading UI file 'VideoTemplate.ui'
|
||||
##
|
||||
## Created by: Qt User Interface Compiler version 6.0.0
|
||||
##
|
||||
## WARNING! All changes made in this file will be lost when recompiling UI file!
|
||||
################################################################################
|
||||
|
||||
from PySide6.QtCore import *
|
||||
from PySide6.QtGui import *
|
||||
from PySide6.QtWidgets import *
|
||||
|
||||
from pyqtgraph import GraphicsView
|
||||
from pyqtgraph.widgets.RawImageWidget import RawImageWidget
|
||||
from pyqtgraph import GradientWidget
|
||||
from pyqtgraph import SpinBox
|
||||
|
||||
|
||||
class Ui_MainWindow(object):
|
||||
def setupUi(self, MainWindow):
|
||||
if not MainWindow.objectName():
|
||||
MainWindow.setObjectName(u"MainWindow")
|
||||
MainWindow.resize(695, 798)
|
||||
self.centralwidget = QWidget(MainWindow)
|
||||
self.centralwidget.setObjectName(u"centralwidget")
|
||||
self.gridLayout_2 = QGridLayout(self.centralwidget)
|
||||
self.gridLayout_2.setObjectName(u"gridLayout_2")
|
||||
self.cudaCheck = QCheckBox(self.centralwidget)
|
||||
self.cudaCheck.setObjectName(u"cudaCheck")
|
||||
|
||||
self.gridLayout_2.addWidget(self.cudaCheck, 9, 0, 1, 2)
|
||||
|
||||
self.downsampleCheck = QCheckBox(self.centralwidget)
|
||||
self.downsampleCheck.setObjectName(u"downsampleCheck")
|
||||
|
||||
self.gridLayout_2.addWidget(self.downsampleCheck, 8, 0, 1, 2)
|
||||
|
||||
self.scaleCheck = QCheckBox(self.centralwidget)
|
||||
self.scaleCheck.setObjectName(u"scaleCheck")
|
||||
|
||||
self.gridLayout_2.addWidget(self.scaleCheck, 4, 0, 1, 1)
|
||||
|
||||
self.gridLayout = QGridLayout()
|
||||
self.gridLayout.setObjectName(u"gridLayout")
|
||||
self.rawRadio = QRadioButton(self.centralwidget)
|
||||
self.rawRadio.setObjectName(u"rawRadio")
|
||||
|
||||
self.gridLayout.addWidget(self.rawRadio, 3, 0, 1, 1)
|
||||
|
||||
self.gfxRadio = QRadioButton(self.centralwidget)
|
||||
self.gfxRadio.setObjectName(u"gfxRadio")
|
||||
self.gfxRadio.setChecked(True)
|
||||
|
||||
self.gridLayout.addWidget(self.gfxRadio, 2, 0, 1, 1)
|
||||
|
||||
self.stack = QStackedWidget(self.centralwidget)
|
||||
self.stack.setObjectName(u"stack")
|
||||
self.page = QWidget()
|
||||
self.page.setObjectName(u"page")
|
||||
self.gridLayout_3 = QGridLayout(self.page)
|
||||
self.gridLayout_3.setObjectName(u"gridLayout_3")
|
||||
self.graphicsView = GraphicsView(self.page)
|
||||
self.graphicsView.setObjectName(u"graphicsView")
|
||||
|
||||
self.gridLayout_3.addWidget(self.graphicsView, 0, 0, 1, 1)
|
||||
|
||||
self.stack.addWidget(self.page)
|
||||
self.page_2 = QWidget()
|
||||
self.page_2.setObjectName(u"page_2")
|
||||
self.gridLayout_4 = QGridLayout(self.page_2)
|
||||
self.gridLayout_4.setObjectName(u"gridLayout_4")
|
||||
self.rawImg = RawImageWidget(self.page_2)
|
||||
self.rawImg.setObjectName(u"rawImg")
|
||||
sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.rawImg.sizePolicy().hasHeightForWidth())
|
||||
self.rawImg.setSizePolicy(sizePolicy)
|
||||
|
||||
self.gridLayout_4.addWidget(self.rawImg, 0, 0, 1, 1)
|
||||
|
||||
self.stack.addWidget(self.page_2)
|
||||
|
||||
self.gridLayout.addWidget(self.stack, 0, 0, 1, 1)
|
||||
|
||||
self.rawGLRadio = QRadioButton(self.centralwidget)
|
||||
self.rawGLRadio.setObjectName(u"rawGLRadio")
|
||||
|
||||
self.gridLayout.addWidget(self.rawGLRadio, 4, 0, 1, 1)
|
||||
|
||||
|
||||
self.gridLayout_2.addLayout(self.gridLayout, 1, 0, 1, 4)
|
||||
|
||||
self.dtypeCombo = QComboBox(self.centralwidget)
|
||||
self.dtypeCombo.addItem("")
|
||||
self.dtypeCombo.addItem("")
|
||||
self.dtypeCombo.addItem("")
|
||||
self.dtypeCombo.setObjectName(u"dtypeCombo")
|
||||
|
||||
self.gridLayout_2.addWidget(self.dtypeCombo, 3, 2, 1, 1)
|
||||
|
||||
self.label = QLabel(self.centralwidget)
|
||||
self.label.setObjectName(u"label")
|
||||
|
||||
self.gridLayout_2.addWidget(self.label, 3, 0, 1, 1)
|
||||
|
||||
self.rgbLevelsCheck = QCheckBox(self.centralwidget)
|
||||
self.rgbLevelsCheck.setObjectName(u"rgbLevelsCheck")
|
||||
|
||||
self.gridLayout_2.addWidget(self.rgbLevelsCheck, 4, 1, 1, 1)
|
||||
|
||||
self.horizontalLayout_2 = QHBoxLayout()
|
||||
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
|
||||
self.minSpin2 = SpinBox(self.centralwidget)
|
||||
self.minSpin2.setObjectName(u"minSpin2")
|
||||
self.minSpin2.setEnabled(False)
|
||||
|
||||
self.horizontalLayout_2.addWidget(self.minSpin2)
|
||||
|
||||
self.label_3 = QLabel(self.centralwidget)
|
||||
self.label_3.setObjectName(u"label_3")
|
||||
self.label_3.setAlignment(Qt.AlignCenter)
|
||||
|
||||
self.horizontalLayout_2.addWidget(self.label_3)
|
||||
|
||||
self.maxSpin2 = SpinBox(self.centralwidget)
|
||||
self.maxSpin2.setObjectName(u"maxSpin2")
|
||||
self.maxSpin2.setEnabled(False)
|
||||
|
||||
self.horizontalLayout_2.addWidget(self.maxSpin2)
|
||||
|
||||
|
||||
self.gridLayout_2.addLayout(self.horizontalLayout_2, 5, 2, 1, 1)
|
||||
|
||||
self.horizontalLayout = QHBoxLayout()
|
||||
self.horizontalLayout.setObjectName(u"horizontalLayout")
|
||||
self.minSpin1 = SpinBox(self.centralwidget)
|
||||
self.minSpin1.setObjectName(u"minSpin1")
|
||||
|
||||
self.horizontalLayout.addWidget(self.minSpin1)
|
||||
|
||||
self.label_2 = QLabel(self.centralwidget)
|
||||
self.label_2.setObjectName(u"label_2")
|
||||
self.label_2.setAlignment(Qt.AlignCenter)
|
||||
|
||||
self.horizontalLayout.addWidget(self.label_2)
|
||||
|
||||
self.maxSpin1 = SpinBox(self.centralwidget)
|
||||
self.maxSpin1.setObjectName(u"maxSpin1")
|
||||
|
||||
self.horizontalLayout.addWidget(self.maxSpin1)
|
||||
|
||||
|
||||
self.gridLayout_2.addLayout(self.horizontalLayout, 4, 2, 1, 1)
|
||||
|
||||
self.horizontalLayout_3 = QHBoxLayout()
|
||||
self.horizontalLayout_3.setObjectName(u"horizontalLayout_3")
|
||||
self.minSpin3 = SpinBox(self.centralwidget)
|
||||
self.minSpin3.setObjectName(u"minSpin3")
|
||||
self.minSpin3.setEnabled(False)
|
||||
|
||||
self.horizontalLayout_3.addWidget(self.minSpin3)
|
||||
|
||||
self.label_4 = QLabel(self.centralwidget)
|
||||
self.label_4.setObjectName(u"label_4")
|
||||
self.label_4.setAlignment(Qt.AlignCenter)
|
||||
|
||||
self.horizontalLayout_3.addWidget(self.label_4)
|
||||
|
||||
self.maxSpin3 = SpinBox(self.centralwidget)
|
||||
self.maxSpin3.setObjectName(u"maxSpin3")
|
||||
self.maxSpin3.setEnabled(False)
|
||||
|
||||
self.horizontalLayout_3.addWidget(self.maxSpin3)
|
||||
|
||||
|
||||
self.gridLayout_2.addLayout(self.horizontalLayout_3, 6, 2, 1, 1)
|
||||
|
||||
self.lutCheck = QCheckBox(self.centralwidget)
|
||||
self.lutCheck.setObjectName(u"lutCheck")
|
||||
|
||||
self.gridLayout_2.addWidget(self.lutCheck, 7, 0, 1, 1)
|
||||
|
||||
self.alphaCheck = QCheckBox(self.centralwidget)
|
||||
self.alphaCheck.setObjectName(u"alphaCheck")
|
||||
|
||||
self.gridLayout_2.addWidget(self.alphaCheck, 7, 1, 1, 1)
|
||||
|
||||
self.gradient = GradientWidget(self.centralwidget)
|
||||
self.gradient.setObjectName(u"gradient")
|
||||
sizePolicy.setHeightForWidth(self.gradient.sizePolicy().hasHeightForWidth())
|
||||
self.gradient.setSizePolicy(sizePolicy)
|
||||
|
||||
self.gridLayout_2.addWidget(self.gradient, 7, 2, 1, 2)
|
||||
|
||||
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
|
||||
|
||||
self.gridLayout_2.addItem(self.horizontalSpacer, 3, 3, 1, 1)
|
||||
|
||||
self.fpsLabel = QLabel(self.centralwidget)
|
||||
self.fpsLabel.setObjectName(u"fpsLabel")
|
||||
font = QFont()
|
||||
font.setPointSize(12)
|
||||
self.fpsLabel.setFont(font)
|
||||
self.fpsLabel.setAlignment(Qt.AlignCenter)
|
||||
|
||||
self.gridLayout_2.addWidget(self.fpsLabel, 0, 0, 1, 4)
|
||||
|
||||
self.rgbCheck = QCheckBox(self.centralwidget)
|
||||
self.rgbCheck.setObjectName(u"rgbCheck")
|
||||
|
||||
self.gridLayout_2.addWidget(self.rgbCheck, 3, 1, 1, 1)
|
||||
|
||||
self.label_5 = QLabel(self.centralwidget)
|
||||
self.label_5.setObjectName(u"label_5")
|
||||
|
||||
self.gridLayout_2.addWidget(self.label_5, 2, 0, 1, 1)
|
||||
|
||||
self.horizontalLayout_4 = QHBoxLayout()
|
||||
self.horizontalLayout_4.setObjectName(u"horizontalLayout_4")
|
||||
self.framesSpin = QSpinBox(self.centralwidget)
|
||||
self.framesSpin.setObjectName(u"framesSpin")
|
||||
self.framesSpin.setButtonSymbols(QAbstractSpinBox.NoButtons)
|
||||
self.framesSpin.setValue(10)
|
||||
|
||||
self.horizontalLayout_4.addWidget(self.framesSpin)
|
||||
|
||||
self.widthSpin = QSpinBox(self.centralwidget)
|
||||
self.widthSpin.setObjectName(u"widthSpin")
|
||||
self.widthSpin.setButtonSymbols(QAbstractSpinBox.PlusMinus)
|
||||
self.widthSpin.setMaximum(10000)
|
||||
self.widthSpin.setValue(512)
|
||||
|
||||
self.horizontalLayout_4.addWidget(self.widthSpin)
|
||||
|
||||
self.heightSpin = QSpinBox(self.centralwidget)
|
||||
self.heightSpin.setObjectName(u"heightSpin")
|
||||
self.heightSpin.setButtonSymbols(QAbstractSpinBox.NoButtons)
|
||||
self.heightSpin.setMaximum(10000)
|
||||
self.heightSpin.setValue(512)
|
||||
|
||||
self.horizontalLayout_4.addWidget(self.heightSpin)
|
||||
|
||||
|
||||
self.gridLayout_2.addLayout(self.horizontalLayout_4, 2, 1, 1, 2)
|
||||
|
||||
self.sizeLabel = QLabel(self.centralwidget)
|
||||
self.sizeLabel.setObjectName(u"sizeLabel")
|
||||
|
||||
self.gridLayout_2.addWidget(self.sizeLabel, 2, 3, 1, 1)
|
||||
|
||||
MainWindow.setCentralWidget(self.centralwidget)
|
||||
|
||||
self.retranslateUi(MainWindow)
|
||||
|
||||
self.stack.setCurrentIndex(1)
|
||||
|
||||
|
||||
QMetaObject.connectSlotsByName(MainWindow)
|
||||
# setupUi
|
||||
|
||||
def retranslateUi(self, MainWindow):
|
||||
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
|
||||
self.cudaCheck.setText(QCoreApplication.translate("MainWindow", u"Use CUDA (GPU) if available", None))
|
||||
self.downsampleCheck.setText(QCoreApplication.translate("MainWindow", u"Auto downsample", None))
|
||||
self.scaleCheck.setText(QCoreApplication.translate("MainWindow", u"Scale Data", None))
|
||||
self.rawRadio.setText(QCoreApplication.translate("MainWindow", u"RawImageWidget", None))
|
||||
self.gfxRadio.setText(QCoreApplication.translate("MainWindow", u"GraphicsView + ImageItem", None))
|
||||
self.rawGLRadio.setText(QCoreApplication.translate("MainWindow", u"RawGLImageWidget", None))
|
||||
self.dtypeCombo.setItemText(0, QCoreApplication.translate("MainWindow", u"uint8", None))
|
||||
self.dtypeCombo.setItemText(1, QCoreApplication.translate("MainWindow", u"uint16", None))
|
||||
self.dtypeCombo.setItemText(2, QCoreApplication.translate("MainWindow", u"float", None))
|
||||
|
||||
self.label.setText(QCoreApplication.translate("MainWindow", u"Data type", None))
|
||||
self.rgbLevelsCheck.setText(QCoreApplication.translate("MainWindow", u"RGB", None))
|
||||
self.label_3.setText(QCoreApplication.translate("MainWindow", u"<--->", None))
|
||||
self.label_2.setText(QCoreApplication.translate("MainWindow", u"<--->", None))
|
||||
self.label_4.setText(QCoreApplication.translate("MainWindow", u"<--->", None))
|
||||
self.lutCheck.setText(QCoreApplication.translate("MainWindow", u"Use Lookup Table", None))
|
||||
self.alphaCheck.setText(QCoreApplication.translate("MainWindow", u"alpha", None))
|
||||
self.fpsLabel.setText(QCoreApplication.translate("MainWindow", u"FPS", None))
|
||||
self.rgbCheck.setText(QCoreApplication.translate("MainWindow", u"RGB", None))
|
||||
self.label_5.setText(QCoreApplication.translate("MainWindow", u"Image size", None))
|
||||
self.sizeLabel.setText("")
|
||||
# retranslateUi
|
||||
|
@ -18,7 +18,7 @@ import numpy as np
|
||||
from pyqtgraph.Qt import QtGui, QtCore
|
||||
import pyqtgraph as pg
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("ViewBox Example")
|
||||
mw = QtGui.QMainWindow()
|
||||
mw.setWindowTitle('pyqtgraph example: ViewBox')
|
||||
mw.show()
|
||||
|
103
examples/colorMaps.py
Normal file
103
examples/colorMaps.py
Normal file
@ -0,0 +1,103 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
This example demonstrates the use of ImageView, which is a high-level widget for
|
||||
displaying and analyzing 2D and 3D data. ImageView provides:
|
||||
|
||||
1. A zoomable region (ViewBox) for displaying the image
|
||||
2. A combination histogram and gradient editor (HistogramLUTItem) for
|
||||
controlling the visual appearance of the image
|
||||
3. A timeline for selecting the currently displayed frame (for 3D data only).
|
||||
4. Tools for very basic analysis of image data (see ROI and Norm buttons)
|
||||
|
||||
"""
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
import numpy as np
|
||||
from pyqtgraph.Qt import QtCore, QtGui
|
||||
import pyqtgraph as pg
|
||||
|
||||
app = pg.mkQApp()
|
||||
|
||||
## Create window with ImageView widget
|
||||
win = QtGui.QMainWindow()
|
||||
win.resize(1000,800)
|
||||
|
||||
lw = pg.GraphicsLayoutWidget()
|
||||
lw.setFixedWidth(1000)
|
||||
lw.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
|
||||
|
||||
scr = QtGui.QScrollArea()
|
||||
scr.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
|
||||
scr.setWidget(lw)
|
||||
win.setCentralWidget(scr)
|
||||
win.show()
|
||||
win.setWindowTitle('pyqtgraph example: Color maps')
|
||||
|
||||
## Create color map test image
|
||||
width = 3*256
|
||||
height = 32
|
||||
img = np.zeros( (width, height) )
|
||||
gradient = np.linspace(0.05, 0.95, width)
|
||||
modulation = np.zeros(width)
|
||||
for idx in range(width):
|
||||
modulation[idx] = -0.05 * np.sin( 200 * np.pi * idx/width )
|
||||
for idx in range(height):
|
||||
img[:,idx] = gradient + (idx/(height-1)) * modulation
|
||||
|
||||
num_bars = 0
|
||||
|
||||
lw.addLabel('=== local color maps ===')
|
||||
num_bars += 1
|
||||
lw.nextRow()
|
||||
list_of_maps = pg.colormap.listMaps()
|
||||
for map_name in list_of_maps:
|
||||
num_bars += 1
|
||||
lw.addLabel(map_name)
|
||||
cmap = pg.colormap.get(map_name)
|
||||
imi = pg.ImageItem()
|
||||
imi.setImage(img)
|
||||
imi.setLookupTable( cmap.getLookupTable(alpha=True) )
|
||||
vb = lw.addViewBox(lockAspect=True, enableMouse=False)
|
||||
vb.addItem(imi)
|
||||
lw.nextRow()
|
||||
|
||||
lw.addLabel('=== Matplotlib import ===')
|
||||
num_bars += 1
|
||||
lw.nextRow()
|
||||
list_of_maps = pg.colormap.listMaps('matplotlib')
|
||||
for map_name in list_of_maps:
|
||||
num_bars += 1
|
||||
lw.addLabel(map_name)
|
||||
cmap = pg.colormap.get(map_name, source='matplotlib', skipCache=True)
|
||||
if cmap is not None:
|
||||
imi = pg.ImageItem()
|
||||
imi.setImage(img)
|
||||
imi.setLookupTable( cmap.getLookupTable(alpha=True) )
|
||||
vb = lw.addViewBox(lockAspect=True, enableMouse=False)
|
||||
vb.addItem(imi)
|
||||
lw.nextRow()
|
||||
|
||||
lw.addLabel('=== ColorCET import ===')
|
||||
num_bars += 1
|
||||
lw.nextRow()
|
||||
list_of_maps = pg.colormap.listMaps('colorcet')
|
||||
for map_name in list_of_maps:
|
||||
num_bars += 1
|
||||
lw.addLabel(map_name)
|
||||
cmap = pg.colormap.get(map_name, source='colorcet', skipCache=True)
|
||||
if cmap is not None:
|
||||
imi = pg.ImageItem()
|
||||
imi.setImage(img)
|
||||
imi.setLookupTable( cmap.getLookupTable(alpha=True) )
|
||||
vb = lw.addViewBox(lockAspect=True, enableMouse=False)
|
||||
vb.addItem(imi)
|
||||
lw.nextRow()
|
||||
|
||||
lw.setFixedHeight(num_bars * (height+5) )
|
||||
|
||||
## Start Qt event loop unless running in interactive mode.
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
|
||||
QtGui.QApplication.instance().exec_()
|
@ -12,7 +12,7 @@ from pyqtgraph.Qt import QtGui, QtCore
|
||||
from pyqtgraph.Point import Point
|
||||
|
||||
#generate layout
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Crosshair Example")
|
||||
win = pg.GraphicsLayoutWidget(show=True)
|
||||
win.setWindowTitle('pyqtgraph example: crosshair')
|
||||
label = pg.LabelItem(justify='right')
|
||||
|
@ -1,32 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Form implementation generated from reading ui file 'examples/designerExample.ui'
|
||||
#
|
||||
# Created: Fri Feb 16 20:31:04 2018
|
||||
# by: pyside2-uic 2.0.0 running on PySide2 2.0.0~alpha0
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
||||
from PySide2 import QtCore, QtGui, QtWidgets
|
||||
|
||||
class Ui_Form(object):
|
||||
def setupUi(self, Form):
|
||||
Form.setObjectName("Form")
|
||||
Form.resize(400, 300)
|
||||
self.gridLayout = QtWidgets.QGridLayout(Form)
|
||||
self.gridLayout.setObjectName("gridLayout")
|
||||
self.plotBtn = QtWidgets.QPushButton(Form)
|
||||
self.plotBtn.setObjectName("plotBtn")
|
||||
self.gridLayout.addWidget(self.plotBtn, 0, 0, 1, 1)
|
||||
self.plot = PlotWidget(Form)
|
||||
self.plot.setObjectName("plot")
|
||||
self.gridLayout.addWidget(self.plot, 1, 0, 1, 1)
|
||||
|
||||
self.retranslateUi(Form)
|
||||
QtCore.QMetaObject.connectSlotsByName(Form)
|
||||
|
||||
def retranslateUi(self, Form):
|
||||
Form.setWindowTitle(QtWidgets.QApplication.translate("Form", "Form", None, -1))
|
||||
self.plotBtn.setText(QtWidgets.QApplication.translate("Form", "Plot!", None, -1))
|
||||
|
||||
from pyqtgraph import PlotWidget
|
@ -24,7 +24,7 @@ import numpy as np
|
||||
|
||||
from pyqtgraph.dockarea import *
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("DockArea Example")
|
||||
win = QtGui.QMainWindow()
|
||||
area = DockArea()
|
||||
win.setCentralWidget(area)
|
||||
|
@ -64,16 +64,6 @@
|
||||
<string>default</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>PyQt4</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>PySide</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>PyQt5</string>
|
||||
@ -84,6 +74,16 @@
|
||||
<string>PySide2</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>PySide6</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>PyQt6</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
@ -115,7 +115,6 @@
|
||||
<widget class="QLabel" name="loadedFileLabel">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
|
@ -1,105 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Form implementation generated from reading ui file 'examples/exampleLoaderTemplate.ui'
|
||||
#
|
||||
# Created by: PyQt4 UI code generator 4.11.4
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
try:
|
||||
_fromUtf8 = QtCore.QString.fromUtf8
|
||||
except AttributeError:
|
||||
def _fromUtf8(s):
|
||||
return s
|
||||
|
||||
try:
|
||||
_encoding = QtGui.QApplication.UnicodeUTF8
|
||||
def _translate(context, text, disambig):
|
||||
return QtGui.QApplication.translate(context, text, disambig, _encoding)
|
||||
except AttributeError:
|
||||
def _translate(context, text, disambig):
|
||||
return QtGui.QApplication.translate(context, text, disambig)
|
||||
|
||||
class Ui_Form(object):
|
||||
def setupUi(self, Form):
|
||||
Form.setObjectName(_fromUtf8("Form"))
|
||||
Form.resize(846, 552)
|
||||
self.gridLayout_2 = QtGui.QGridLayout(Form)
|
||||
self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
|
||||
self.splitter = QtGui.QSplitter(Form)
|
||||
self.splitter.setOrientation(QtCore.Qt.Horizontal)
|
||||
self.splitter.setObjectName(_fromUtf8("splitter"))
|
||||
self.widget = QtGui.QWidget(self.splitter)
|
||||
self.widget.setObjectName(_fromUtf8("widget"))
|
||||
self.gridLayout = QtGui.QGridLayout(self.widget)
|
||||
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
|
||||
self.exampleTree = QtGui.QTreeWidget(self.widget)
|
||||
self.exampleTree.setObjectName(_fromUtf8("exampleTree"))
|
||||
self.exampleTree.headerItem().setText(0, _fromUtf8("1"))
|
||||
self.exampleTree.header().setVisible(False)
|
||||
self.gridLayout.addWidget(self.exampleTree, 0, 0, 1, 2)
|
||||
self.graphicsSystemCombo = QtGui.QComboBox(self.widget)
|
||||
self.graphicsSystemCombo.setObjectName(_fromUtf8("graphicsSystemCombo"))
|
||||
self.graphicsSystemCombo.addItem(_fromUtf8(""))
|
||||
self.graphicsSystemCombo.addItem(_fromUtf8(""))
|
||||
self.graphicsSystemCombo.addItem(_fromUtf8(""))
|
||||
self.graphicsSystemCombo.addItem(_fromUtf8(""))
|
||||
self.gridLayout.addWidget(self.graphicsSystemCombo, 2, 1, 1, 1)
|
||||
self.qtLibCombo = QtGui.QComboBox(self.widget)
|
||||
self.qtLibCombo.setObjectName(_fromUtf8("qtLibCombo"))
|
||||
self.qtLibCombo.addItem(_fromUtf8(""))
|
||||
self.qtLibCombo.addItem(_fromUtf8(""))
|
||||
self.qtLibCombo.addItem(_fromUtf8(""))
|
||||
self.qtLibCombo.addItem(_fromUtf8(""))
|
||||
self.qtLibCombo.addItem(_fromUtf8(""))
|
||||
self.gridLayout.addWidget(self.qtLibCombo, 1, 1, 1, 1)
|
||||
self.label_2 = QtGui.QLabel(self.widget)
|
||||
self.label_2.setObjectName(_fromUtf8("label_2"))
|
||||
self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
|
||||
self.label = QtGui.QLabel(self.widget)
|
||||
self.label.setObjectName(_fromUtf8("label"))
|
||||
self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
|
||||
self.loadBtn = QtGui.QPushButton(self.widget)
|
||||
self.loadBtn.setObjectName(_fromUtf8("loadBtn"))
|
||||
self.gridLayout.addWidget(self.loadBtn, 3, 1, 1, 1)
|
||||
self.widget1 = QtGui.QWidget(self.splitter)
|
||||
self.widget1.setObjectName(_fromUtf8("widget1"))
|
||||
self.verticalLayout = QtGui.QVBoxLayout(self.widget1)
|
||||
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
|
||||
self.loadedFileLabel = QtGui.QLabel(self.widget1)
|
||||
font = QtGui.QFont()
|
||||
font.setBold(True)
|
||||
font.setWeight(75)
|
||||
self.loadedFileLabel.setFont(font)
|
||||
self.loadedFileLabel.setText(_fromUtf8(""))
|
||||
self.loadedFileLabel.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.loadedFileLabel.setObjectName(_fromUtf8("loadedFileLabel"))
|
||||
self.verticalLayout.addWidget(self.loadedFileLabel)
|
||||
self.codeView = QtGui.QPlainTextEdit(self.widget1)
|
||||
font = QtGui.QFont()
|
||||
font.setFamily(_fromUtf8("Courier New"))
|
||||
self.codeView.setFont(font)
|
||||
self.codeView.setObjectName(_fromUtf8("codeView"))
|
||||
self.verticalLayout.addWidget(self.codeView)
|
||||
self.gridLayout_2.addWidget(self.splitter, 0, 0, 1, 1)
|
||||
|
||||
self.retranslateUi(Form)
|
||||
QtCore.QMetaObject.connectSlotsByName(Form)
|
||||
|
||||
def retranslateUi(self, Form):
|
||||
Form.setWindowTitle(_translate("Form", "PyQtGraph", None))
|
||||
self.graphicsSystemCombo.setItemText(0, _translate("Form", "default", None))
|
||||
self.graphicsSystemCombo.setItemText(1, _translate("Form", "native", None))
|
||||
self.graphicsSystemCombo.setItemText(2, _translate("Form", "raster", None))
|
||||
self.graphicsSystemCombo.setItemText(3, _translate("Form", "opengl", None))
|
||||
self.qtLibCombo.setItemText(0, _translate("Form", "default", None))
|
||||
self.qtLibCombo.setItemText(1, _translate("Form", "PyQt4", None))
|
||||
self.qtLibCombo.setItemText(2, _translate("Form", "PySide", None))
|
||||
self.qtLibCombo.setItemText(3, _translate("Form", "PyQt5", None))
|
||||
self.qtLibCombo.setItemText(4, _translate("Form", "PySide2", None))
|
||||
self.label_2.setText(_translate("Form", "Graphics System:", None))
|
||||
self.label.setText(_translate("Form", "Qt Library:", None))
|
||||
self.loadBtn.setText(_translate("Form", "Run Example", None))
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
# Form implementation generated from reading ui file 'exampleLoaderTemplate.ui'
|
||||
#
|
||||
# Created by: PyQt5 UI code generator 5.15.1
|
||||
# Created by: PyQt5 UI code generator 5.15.2
|
||||
#
|
||||
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
||||
# run again. Do not edit this file unless you know what you are doing.
|
||||
@ -62,7 +62,6 @@ class Ui_Form(object):
|
||||
self.loadedFileLabel = QtWidgets.QLabel(self.widget1)
|
||||
font = QtGui.QFont()
|
||||
font.setBold(True)
|
||||
font.setWeight(75)
|
||||
self.loadedFileLabel.setFont(font)
|
||||
self.loadedFileLabel.setText("")
|
||||
self.loadedFileLabel.setAlignment(QtCore.Qt.AlignCenter)
|
||||
@ -87,10 +86,10 @@ class Ui_Form(object):
|
||||
self.graphicsSystemCombo.setItemText(2, _translate("Form", "raster"))
|
||||
self.graphicsSystemCombo.setItemText(3, _translate("Form", "opengl"))
|
||||
self.qtLibCombo.setItemText(0, _translate("Form", "default"))
|
||||
self.qtLibCombo.setItemText(1, _translate("Form", "PyQt4"))
|
||||
self.qtLibCombo.setItemText(2, _translate("Form", "PySide"))
|
||||
self.qtLibCombo.setItemText(3, _translate("Form", "PyQt5"))
|
||||
self.qtLibCombo.setItemText(4, _translate("Form", "PySide2"))
|
||||
self.qtLibCombo.setItemText(1, _translate("Form", "PyQt5"))
|
||||
self.qtLibCombo.setItemText(2, _translate("Form", "PySide2"))
|
||||
self.qtLibCombo.setItemText(3, _translate("Form", "PySide6"))
|
||||
self.qtLibCombo.setItemText(4, _translate("Form", "PyQt6"))
|
||||
self.label_2.setText(_translate("Form", "Graphics System:"))
|
||||
self.label.setText(_translate("Form", "Qt Library:"))
|
||||
self.loadBtn.setText(_translate("Form", "Run Example"))
|
||||
|
93
examples/exampleLoaderTemplate_pyqt6.py
Normal file
93
examples/exampleLoaderTemplate_pyqt6.py
Normal file
@ -0,0 +1,93 @@
|
||||
# Form implementation generated from reading ui file 'exampleLoaderTemplate.ui'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.0.0
|
||||
#
|
||||
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
|
||||
# run again. Do not edit this file unless you know what you are doing.
|
||||
|
||||
|
||||
from PyQt6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class Ui_Form(object):
|
||||
def setupUi(self, Form):
|
||||
Form.setObjectName("Form")
|
||||
Form.resize(846, 552)
|
||||
self.gridLayout_2 = QtWidgets.QGridLayout(Form)
|
||||
self.gridLayout_2.setObjectName("gridLayout_2")
|
||||
self.splitter = QtWidgets.QSplitter(Form)
|
||||
self.splitter.setOrientation(QtCore.Qt.Orientations.Horizontal)
|
||||
self.splitter.setObjectName("splitter")
|
||||
self.widget = QtWidgets.QWidget(self.splitter)
|
||||
self.widget.setObjectName("widget")
|
||||
self.gridLayout = QtWidgets.QGridLayout(self.widget)
|
||||
self.gridLayout.setContentsMargins(0, 0, 0, 0)
|
||||
self.gridLayout.setObjectName("gridLayout")
|
||||
self.exampleTree = QtWidgets.QTreeWidget(self.widget)
|
||||
self.exampleTree.setObjectName("exampleTree")
|
||||
self.exampleTree.headerItem().setText(0, "1")
|
||||
self.exampleTree.header().setVisible(False)
|
||||
self.gridLayout.addWidget(self.exampleTree, 0, 0, 1, 2)
|
||||
self.graphicsSystemCombo = QtWidgets.QComboBox(self.widget)
|
||||
self.graphicsSystemCombo.setObjectName("graphicsSystemCombo")
|
||||
self.graphicsSystemCombo.addItem("")
|
||||
self.graphicsSystemCombo.addItem("")
|
||||
self.graphicsSystemCombo.addItem("")
|
||||
self.graphicsSystemCombo.addItem("")
|
||||
self.gridLayout.addWidget(self.graphicsSystemCombo, 2, 1, 1, 1)
|
||||
self.qtLibCombo = QtWidgets.QComboBox(self.widget)
|
||||
self.qtLibCombo.setObjectName("qtLibCombo")
|
||||
self.qtLibCombo.addItem("")
|
||||
self.qtLibCombo.addItem("")
|
||||
self.qtLibCombo.addItem("")
|
||||
self.qtLibCombo.addItem("")
|
||||
self.qtLibCombo.addItem("")
|
||||
self.gridLayout.addWidget(self.qtLibCombo, 1, 1, 1, 1)
|
||||
self.label_2 = QtWidgets.QLabel(self.widget)
|
||||
self.label_2.setObjectName("label_2")
|
||||
self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
|
||||
self.label = QtWidgets.QLabel(self.widget)
|
||||
self.label.setObjectName("label")
|
||||
self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
|
||||
self.loadBtn = QtWidgets.QPushButton(self.widget)
|
||||
self.loadBtn.setObjectName("loadBtn")
|
||||
self.gridLayout.addWidget(self.loadBtn, 3, 1, 1, 1)
|
||||
self.widget1 = QtWidgets.QWidget(self.splitter)
|
||||
self.widget1.setObjectName("widget1")
|
||||
self.verticalLayout = QtWidgets.QVBoxLayout(self.widget1)
|
||||
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
|
||||
self.verticalLayout.setObjectName("verticalLayout")
|
||||
self.loadedFileLabel = QtWidgets.QLabel(self.widget1)
|
||||
font = QtGui.QFont()
|
||||
font.setBold(True)
|
||||
self.loadedFileLabel.setFont(font)
|
||||
self.loadedFileLabel.setText("")
|
||||
self.loadedFileLabel.setAlignment(QtCore.Qt.Alignment.AlignCenter)
|
||||
self.loadedFileLabel.setObjectName("loadedFileLabel")
|
||||
self.verticalLayout.addWidget(self.loadedFileLabel)
|
||||
self.codeView = QtWidgets.QPlainTextEdit(self.widget1)
|
||||
font = QtGui.QFont()
|
||||
font.setFamily("Courier New")
|
||||
self.codeView.setFont(font)
|
||||
self.codeView.setObjectName("codeView")
|
||||
self.verticalLayout.addWidget(self.codeView)
|
||||
self.gridLayout_2.addWidget(self.splitter, 0, 0, 1, 1)
|
||||
|
||||
self.retranslateUi(Form)
|
||||
QtCore.QMetaObject.connectSlotsByName(Form)
|
||||
|
||||
def retranslateUi(self, Form):
|
||||
_translate = QtCore.QCoreApplication.translate
|
||||
Form.setWindowTitle(_translate("Form", "PyQtGraph"))
|
||||
self.graphicsSystemCombo.setItemText(0, _translate("Form", "default"))
|
||||
self.graphicsSystemCombo.setItemText(1, _translate("Form", "native"))
|
||||
self.graphicsSystemCombo.setItemText(2, _translate("Form", "raster"))
|
||||
self.graphicsSystemCombo.setItemText(3, _translate("Form", "opengl"))
|
||||
self.qtLibCombo.setItemText(0, _translate("Form", "default"))
|
||||
self.qtLibCombo.setItemText(1, _translate("Form", "PyQt5"))
|
||||
self.qtLibCombo.setItemText(2, _translate("Form", "PySide2"))
|
||||
self.qtLibCombo.setItemText(3, _translate("Form", "PySide6"))
|
||||
self.qtLibCombo.setItemText(4, _translate("Form", "PyQt6"))
|
||||
self.label_2.setText(_translate("Form", "Graphics System:"))
|
||||
self.label.setText(_translate("Form", "Qt Library:"))
|
||||
self.loadBtn.setText(_translate("Form", "Run Example"))
|
@ -1,94 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Form implementation generated from reading ui file 'exampleLoaderTemplate.ui'
|
||||
#
|
||||
# Created: Sun Oct 18 21:53:22 2020
|
||||
# by: pyside-uic 0.2.15 running on PySide 1.2.4
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
||||
from PySide import QtCore, QtGui
|
||||
|
||||
class Ui_Form(object):
|
||||
def setupUi(self, Form):
|
||||
Form.setObjectName("Form")
|
||||
Form.resize(846, 552)
|
||||
self.gridLayout_2 = QtGui.QGridLayout(Form)
|
||||
self.gridLayout_2.setObjectName("gridLayout_2")
|
||||
self.splitter = QtGui.QSplitter(Form)
|
||||
self.splitter.setOrientation(QtCore.Qt.Horizontal)
|
||||
self.splitter.setObjectName("splitter")
|
||||
self.widget = QtGui.QWidget(self.splitter)
|
||||
self.widget.setObjectName("widget")
|
||||
self.gridLayout = QtGui.QGridLayout(self.widget)
|
||||
self.gridLayout.setContentsMargins(0, 0, 0, 0)
|
||||
self.gridLayout.setObjectName("gridLayout")
|
||||
self.exampleTree = QtGui.QTreeWidget(self.widget)
|
||||
self.exampleTree.setObjectName("exampleTree")
|
||||
self.exampleTree.headerItem().setText(0, "1")
|
||||
self.exampleTree.header().setVisible(False)
|
||||
self.gridLayout.addWidget(self.exampleTree, 0, 0, 1, 2)
|
||||
self.graphicsSystemCombo = QtGui.QComboBox(self.widget)
|
||||
self.graphicsSystemCombo.setObjectName("graphicsSystemCombo")
|
||||
self.graphicsSystemCombo.addItem("")
|
||||
self.graphicsSystemCombo.addItem("")
|
||||
self.graphicsSystemCombo.addItem("")
|
||||
self.graphicsSystemCombo.addItem("")
|
||||
self.gridLayout.addWidget(self.graphicsSystemCombo, 2, 1, 1, 1)
|
||||
self.qtLibCombo = QtGui.QComboBox(self.widget)
|
||||
self.qtLibCombo.setObjectName("qtLibCombo")
|
||||
self.qtLibCombo.addItem("")
|
||||
self.qtLibCombo.addItem("")
|
||||
self.qtLibCombo.addItem("")
|
||||
self.qtLibCombo.addItem("")
|
||||
self.qtLibCombo.addItem("")
|
||||
self.gridLayout.addWidget(self.qtLibCombo, 1, 1, 1, 1)
|
||||
self.label_2 = QtGui.QLabel(self.widget)
|
||||
self.label_2.setObjectName("label_2")
|
||||
self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
|
||||
self.label = QtGui.QLabel(self.widget)
|
||||
self.label.setObjectName("label")
|
||||
self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
|
||||
self.loadBtn = QtGui.QPushButton(self.widget)
|
||||
self.loadBtn.setObjectName("loadBtn")
|
||||
self.gridLayout.addWidget(self.loadBtn, 3, 1, 1, 1)
|
||||
self.widget1 = QtGui.QWidget(self.splitter)
|
||||
self.widget1.setObjectName("widget1")
|
||||
self.verticalLayout = QtGui.QVBoxLayout(self.widget1)
|
||||
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
|
||||
self.verticalLayout.setObjectName("verticalLayout")
|
||||
self.loadedFileLabel = QtGui.QLabel(self.widget1)
|
||||
font = QtGui.QFont()
|
||||
font.setWeight(75)
|
||||
font.setBold(True)
|
||||
self.loadedFileLabel.setFont(font)
|
||||
self.loadedFileLabel.setText("")
|
||||
self.loadedFileLabel.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.loadedFileLabel.setObjectName("loadedFileLabel")
|
||||
self.verticalLayout.addWidget(self.loadedFileLabel)
|
||||
self.codeView = QtGui.QPlainTextEdit(self.widget1)
|
||||
font = QtGui.QFont()
|
||||
font.setFamily("Courier New")
|
||||
self.codeView.setFont(font)
|
||||
self.codeView.setObjectName("codeView")
|
||||
self.verticalLayout.addWidget(self.codeView)
|
||||
self.gridLayout_2.addWidget(self.splitter, 0, 0, 1, 1)
|
||||
|
||||
self.retranslateUi(Form)
|
||||
QtCore.QMetaObject.connectSlotsByName(Form)
|
||||
|
||||
def retranslateUi(self, Form):
|
||||
Form.setWindowTitle(QtGui.QApplication.translate("Form", "PyQtGraph", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.graphicsSystemCombo.setItemText(0, QtGui.QApplication.translate("Form", "default", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.graphicsSystemCombo.setItemText(1, QtGui.QApplication.translate("Form", "native", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.graphicsSystemCombo.setItemText(2, QtGui.QApplication.translate("Form", "raster", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.graphicsSystemCombo.setItemText(3, QtGui.QApplication.translate("Form", "opengl", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.qtLibCombo.setItemText(0, QtGui.QApplication.translate("Form", "default", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.qtLibCombo.setItemText(1, QtGui.QApplication.translate("Form", "PyQt4", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.qtLibCombo.setItemText(2, QtGui.QApplication.translate("Form", "PySide", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.qtLibCombo.setItemText(3, QtGui.QApplication.translate("Form", "PyQt5", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.qtLibCombo.setItemText(4, QtGui.QApplication.translate("Form", "PySide2", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_2.setText(QtGui.QApplication.translate("Form", "Graphics System:", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label.setText(QtGui.QApplication.translate("Form", "Qt Library:", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.loadBtn.setText(QtGui.QApplication.translate("Form", "Run Example", None, QtGui.QApplication.UnicodeUTF8))
|
||||
|
@ -3,16 +3,13 @@
|
||||
################################################################################
|
||||
## Form generated from reading UI file 'exampleLoaderTemplate.ui'
|
||||
##
|
||||
## Created by: Qt User Interface Compiler version 5.15.0
|
||||
## Created by: Qt User Interface Compiler version 5.15.2
|
||||
##
|
||||
## WARNING! All changes made in this file will be lost when recompiling UI file!
|
||||
################################################################################
|
||||
|
||||
from PySide2.QtCore import (QCoreApplication, QDate, QDateTime, QMetaObject,
|
||||
QObject, QPoint, QRect, QSize, QTime, QUrl, Qt)
|
||||
from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont,
|
||||
QFontDatabase, QIcon, QKeySequence, QLinearGradient, QPalette, QPainter,
|
||||
QPixmap, QRadialGradient)
|
||||
from PySide2.QtCore import *
|
||||
from PySide2.QtGui import *
|
||||
from PySide2.QtWidgets import *
|
||||
|
||||
|
||||
@ -84,7 +81,6 @@ class Ui_Form(object):
|
||||
self.loadedFileLabel.setObjectName(u"loadedFileLabel")
|
||||
font = QFont()
|
||||
font.setBold(True)
|
||||
font.setWeight(75)
|
||||
self.loadedFileLabel.setFont(font)
|
||||
self.loadedFileLabel.setAlignment(Qt.AlignCenter)
|
||||
|
||||
@ -116,10 +112,10 @@ class Ui_Form(object):
|
||||
self.graphicsSystemCombo.setItemText(3, QCoreApplication.translate("Form", u"opengl", None))
|
||||
|
||||
self.qtLibCombo.setItemText(0, QCoreApplication.translate("Form", u"default", None))
|
||||
self.qtLibCombo.setItemText(1, QCoreApplication.translate("Form", u"PyQt4", None))
|
||||
self.qtLibCombo.setItemText(2, QCoreApplication.translate("Form", u"PySide", None))
|
||||
self.qtLibCombo.setItemText(3, QCoreApplication.translate("Form", u"PyQt5", None))
|
||||
self.qtLibCombo.setItemText(4, QCoreApplication.translate("Form", u"PySide2", None))
|
||||
self.qtLibCombo.setItemText(1, QCoreApplication.translate("Form", u"PyQt5", None))
|
||||
self.qtLibCombo.setItemText(2, QCoreApplication.translate("Form", u"PySide2", None))
|
||||
self.qtLibCombo.setItemText(3, QCoreApplication.translate("Form", u"PySide6", None))
|
||||
self.qtLibCombo.setItemText(4, QCoreApplication.translate("Form", u"PyQt6", None))
|
||||
|
||||
self.label_2.setText(QCoreApplication.translate("Form", u"Graphics System:", None))
|
||||
self.label.setText(QCoreApplication.translate("Form", u"Qt Library:", None))
|
||||
|
125
examples/exampleLoaderTemplate_pyside6.py
Normal file
125
examples/exampleLoaderTemplate_pyside6.py
Normal file
@ -0,0 +1,125 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
################################################################################
|
||||
## Form generated from reading UI file 'exampleLoaderTemplate.ui'
|
||||
##
|
||||
## Created by: Qt User Interface Compiler version 6.0.0
|
||||
##
|
||||
## WARNING! All changes made in this file will be lost when recompiling UI file!
|
||||
################################################################################
|
||||
|
||||
from PySide6.QtCore import *
|
||||
from PySide6.QtGui import *
|
||||
from PySide6.QtWidgets import *
|
||||
|
||||
|
||||
class Ui_Form(object):
|
||||
def setupUi(self, Form):
|
||||
if not Form.objectName():
|
||||
Form.setObjectName(u"Form")
|
||||
Form.resize(846, 552)
|
||||
self.gridLayout_2 = QGridLayout(Form)
|
||||
self.gridLayout_2.setObjectName(u"gridLayout_2")
|
||||
self.splitter = QSplitter(Form)
|
||||
self.splitter.setObjectName(u"splitter")
|
||||
self.splitter.setOrientation(Qt.Horizontal)
|
||||
self.widget = QWidget(self.splitter)
|
||||
self.widget.setObjectName(u"widget")
|
||||
self.gridLayout = QGridLayout(self.widget)
|
||||
self.gridLayout.setObjectName(u"gridLayout")
|
||||
self.gridLayout.setContentsMargins(0, 0, 0, 0)
|
||||
self.exampleTree = QTreeWidget(self.widget)
|
||||
__qtreewidgetitem = QTreeWidgetItem()
|
||||
__qtreewidgetitem.setText(0, u"1");
|
||||
self.exampleTree.setHeaderItem(__qtreewidgetitem)
|
||||
self.exampleTree.setObjectName(u"exampleTree")
|
||||
self.exampleTree.header().setVisible(False)
|
||||
|
||||
self.gridLayout.addWidget(self.exampleTree, 0, 0, 1, 2)
|
||||
|
||||
self.graphicsSystemCombo = QComboBox(self.widget)
|
||||
self.graphicsSystemCombo.addItem("")
|
||||
self.graphicsSystemCombo.addItem("")
|
||||
self.graphicsSystemCombo.addItem("")
|
||||
self.graphicsSystemCombo.addItem("")
|
||||
self.graphicsSystemCombo.setObjectName(u"graphicsSystemCombo")
|
||||
|
||||
self.gridLayout.addWidget(self.graphicsSystemCombo, 2, 1, 1, 1)
|
||||
|
||||
self.qtLibCombo = QComboBox(self.widget)
|
||||
self.qtLibCombo.addItem("")
|
||||
self.qtLibCombo.addItem("")
|
||||
self.qtLibCombo.addItem("")
|
||||
self.qtLibCombo.addItem("")
|
||||
self.qtLibCombo.addItem("")
|
||||
self.qtLibCombo.setObjectName(u"qtLibCombo")
|
||||
|
||||
self.gridLayout.addWidget(self.qtLibCombo, 1, 1, 1, 1)
|
||||
|
||||
self.label_2 = QLabel(self.widget)
|
||||
self.label_2.setObjectName(u"label_2")
|
||||
|
||||
self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
|
||||
|
||||
self.label = QLabel(self.widget)
|
||||
self.label.setObjectName(u"label")
|
||||
|
||||
self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
|
||||
|
||||
self.loadBtn = QPushButton(self.widget)
|
||||
self.loadBtn.setObjectName(u"loadBtn")
|
||||
|
||||
self.gridLayout.addWidget(self.loadBtn, 3, 1, 1, 1)
|
||||
|
||||
self.splitter.addWidget(self.widget)
|
||||
self.widget1 = QWidget(self.splitter)
|
||||
self.widget1.setObjectName(u"widget1")
|
||||
self.verticalLayout = QVBoxLayout(self.widget1)
|
||||
self.verticalLayout.setObjectName(u"verticalLayout")
|
||||
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
|
||||
self.loadedFileLabel = QLabel(self.widget1)
|
||||
self.loadedFileLabel.setObjectName(u"loadedFileLabel")
|
||||
font = QFont()
|
||||
font.setBold(True)
|
||||
self.loadedFileLabel.setFont(font)
|
||||
self.loadedFileLabel.setAlignment(Qt.AlignCenter)
|
||||
|
||||
self.verticalLayout.addWidget(self.loadedFileLabel)
|
||||
|
||||
self.codeView = QPlainTextEdit(self.widget1)
|
||||
self.codeView.setObjectName(u"codeView")
|
||||
font1 = QFont()
|
||||
font1.setFamily(u"Courier New")
|
||||
self.codeView.setFont(font1)
|
||||
|
||||
self.verticalLayout.addWidget(self.codeView)
|
||||
|
||||
self.splitter.addWidget(self.widget1)
|
||||
|
||||
self.gridLayout_2.addWidget(self.splitter, 0, 0, 1, 1)
|
||||
|
||||
|
||||
self.retranslateUi(Form)
|
||||
|
||||
QMetaObject.connectSlotsByName(Form)
|
||||
# setupUi
|
||||
|
||||
def retranslateUi(self, Form):
|
||||
Form.setWindowTitle(QCoreApplication.translate("Form", u"PyQtGraph", None))
|
||||
self.graphicsSystemCombo.setItemText(0, QCoreApplication.translate("Form", u"default", None))
|
||||
self.graphicsSystemCombo.setItemText(1, QCoreApplication.translate("Form", u"native", None))
|
||||
self.graphicsSystemCombo.setItemText(2, QCoreApplication.translate("Form", u"raster", None))
|
||||
self.graphicsSystemCombo.setItemText(3, QCoreApplication.translate("Form", u"opengl", None))
|
||||
|
||||
self.qtLibCombo.setItemText(0, QCoreApplication.translate("Form", u"default", None))
|
||||
self.qtLibCombo.setItemText(1, QCoreApplication.translate("Form", u"PyQt5", None))
|
||||
self.qtLibCombo.setItemText(2, QCoreApplication.translate("Form", u"PySide2", None))
|
||||
self.qtLibCombo.setItemText(3, QCoreApplication.translate("Form", u"PySide6", None))
|
||||
self.qtLibCombo.setItemText(4, QCoreApplication.translate("Form", u"PyQt6", None))
|
||||
|
||||
self.label_2.setText(QCoreApplication.translate("Form", u"Graphics System:", None))
|
||||
self.label.setText(QCoreApplication.translate("Form", u"Qt Library:", None))
|
||||
self.loadBtn.setText(QCoreApplication.translate("Form", u"Run Example", None))
|
||||
self.loadedFileLabel.setText("")
|
||||
# retranslateUi
|
||||
|
@ -9,7 +9,7 @@ import pyqtgraph as pg
|
||||
from pyqtgraph.Qt import QtCore, QtGui
|
||||
import numpy as np
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Fractal Example")
|
||||
|
||||
# Set up UI widgets
|
||||
win = pg.QtGui.QWidget()
|
||||
|
@ -5,7 +5,7 @@ from pyqtgraph.Qt import QtGui, QtCore
|
||||
import numpy as np
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph.ptime import time
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Infinite Line Performance")
|
||||
|
||||
p = pg.plot()
|
||||
p.setWindowTitle('pyqtgraph performance: InfiniteLine')
|
||||
|
@ -2,6 +2,7 @@
|
||||
## we do this to make sure that, when running examples, the correct library
|
||||
## version is imported (if there are multiple versions present).
|
||||
import sys, os
|
||||
import importlib
|
||||
|
||||
if not hasattr(sys, 'frozen'):
|
||||
if __file__ == '<stdin>':
|
||||
@ -20,14 +21,10 @@ if not hasattr(sys, 'frozen'):
|
||||
sys.path.insert(0, p)
|
||||
|
||||
## should force example to use PySide instead of PyQt
|
||||
if 'pyside' in sys.argv:
|
||||
from PySide import QtGui
|
||||
elif 'pyqt' in sys.argv:
|
||||
from PyQt4 import QtGui
|
||||
elif 'pyqt5' in sys.argv:
|
||||
from PyQt5 import QtGui
|
||||
elif 'pyside2' in sys.argv:
|
||||
from PySide2 import QtGui
|
||||
for module in ['PyQt5', 'PySide2', 'PySide6', 'PyQt6']:
|
||||
if module.lower() in sys.argv:
|
||||
QtGui = importlib.import_module(module + '.QtGui')
|
||||
break
|
||||
else:
|
||||
from pyqtgraph.Qt import QtGui
|
||||
|
||||
|
@ -11,7 +11,7 @@ from pyqtgraph.Qt import QtGui, QtCore
|
||||
import numpy as np
|
||||
import pyqtgraph as pg
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Isocurve Example")
|
||||
|
||||
## make pretty looping data
|
||||
frames = 200
|
||||
|
@ -13,7 +13,7 @@ import numpy as np
|
||||
import pyqtgraph as pg
|
||||
|
||||
#QtGui.QApplication.setGraphicsSystem('raster')
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Linked Views Example")
|
||||
#mw = QtGui.QMainWindow()
|
||||
#mw.resize(800,800)
|
||||
|
||||
|
@ -9,7 +9,7 @@ from pyqtgraph.Qt import QtGui, QtCore
|
||||
import pyqtgraph as pg
|
||||
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Log Axis Example")
|
||||
|
||||
w = pg.GraphicsLayoutWidget(show=True)
|
||||
w.setWindowTitle('pyqtgraph example: logAxis')
|
||||
|
@ -40,7 +40,7 @@ print( "process finished")
|
||||
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph.Qt import QtCore, QtGui
|
||||
app = pg.QtGui.QApplication([])
|
||||
app = pg.mkQApp("Multiprocess Example")
|
||||
|
||||
print( "\n=================\nStart QtProcess")
|
||||
import sys
|
||||
|
@ -15,7 +15,7 @@ import pyqtgraph as pg
|
||||
import numpy as np
|
||||
from pyqtgraph import Point
|
||||
|
||||
app = pg.QtGui.QApplication([])
|
||||
app = pg.mkQApp("Optics Demo")
|
||||
|
||||
w = pg.GraphicsLayoutWidget(show=True, border=0.5)
|
||||
w.resize(1000, 900)
|
||||
|
@ -14,7 +14,7 @@ import pyqtgraph as pg
|
||||
from pyqtgraph.Qt import QtCore, QtGui
|
||||
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = pg.mkQApp("Parameter Tree Example")
|
||||
import pyqtgraph.parametertree.parameterTypes as pTypes
|
||||
from pyqtgraph.parametertree import Parameter, ParameterTree, ParameterItem, registerParameterType
|
||||
|
||||
|
@ -8,10 +8,10 @@ Description of example
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph.Qt import QtCore, QtGui
|
||||
from pyqtgraph.Qt import QtCore, QtGui, mkQApp
|
||||
import numpy as np
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
app = mkQApp()
|
||||
|
||||
# win.setWindowTitle('pyqtgraph example: ____')
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user