Qt-based framework for controlling scientific instruments over serial ports
Project description
QInstrument
A Qt-based framework for controlling scientific instruments over serial ports.
Instruments are represented as Qt objects with a uniform property system,
automatic UI binding, and JSON-based configuration persistence.
Any Qt binding (PyQt5, PyQt6, PySide2, PySide6) is supported via qtpy.
Instruments
IPG Photonics
- YLR Series: Ytterbium fibre laser
Laser Quantum
- Opus: Continuous-wave laser
PiezoDrive
- PDUS210: Piezo transducer driver
Prior Scientific
- Proscan II/III: Motorised microscope stage controller
Stanford Research Systems
- DS345: 30 MHz Synthesised Function Generator
- SR830: 100 kHz Digital Lock-in Amplifier
- SR844: 200 MHz RF Lock-in Amplifier
Tektronix
- TDS1000: Digital oscilloscope
Installation
git clone https://github.com/davidgrier/QInstrument
cd QInstrument
python -m venv .qi
source .qi/bin/activate
pip install -r requirements.txt
Quick start
Each instrument widget has a built-in example() entry point.
Run it directly from the command line:
python -m QInstrument.instruments.DS345.widget
This finds a connected DS345 and opens its control panel. If no instrument is detected it falls back automatically to a simulated (fake) device so the UI is always usable.
You can also drive the widget from your own application:
from qtpy.QtWidgets import QApplication
from QInstrument.instruments.DS345 import QDS345Widget
app = QApplication([])
widget = QDS345Widget()
widget.show()
app.exec()
Using a simulated instrument
When hardware is not available, import the fake class directly:
from QInstrument.instruments.DS345 import QDS345Widget, QFakeDS345
app = QApplication([])
widget = QDS345Widget(device=QFakeDS345())
widget.show()
app.exec()
Architecture
QtCore.QObject
└── QAbstractInstrument # property/method registry, thread-safe get/set, settings I/O
└── QSerialInstrument # holds QSerialInterface; adds open/find/identify
└── QXxxInstrument # concrete instrument
QtSerialPort.QSerialPort
└── QSerialInterface # raw serial I/O (owned by QSerialInstrument)
QWidget
└── QInstrumentWidget # loads .ui file, auto-binds widgets to registered properties
Each instrument lives in instruments/<Name>/ with three files:
| File | Purpose |
|---|---|
instrument.py |
Serial communication and property registration |
fake.py |
Simulated instrument for UI development without hardware |
widget.py |
Qt widget, .ui file binding, example() entry point |
Development
Run the test suite:
source .qi/bin/activate
pytest tests/
Tests run automatically before every git push via a pre-push hook.
To install the hook in a fresh clone:
cp hooks/pre-push .git/hooks/pre-push # if tracked, else set up manually
chmod +x .git/hooks/pre-push
Acknowledgements
Work on this project at New York University is supported by the National Science Foundation of the United States under award number DMR-2438983.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file qinstrument-1.0.1.tar.gz.
File metadata
- Download URL: qinstrument-1.0.1.tar.gz
- Upload date:
- Size: 75.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d2d3f2821b79b0c801e938a594b41e2d4c904ae7cf2c790370f4a87a33ab3ce7
|
|
| MD5 |
929af95aedae7306d8ae3dc714ffdf22
|
|
| BLAKE2b-256 |
247bdcadde0725b571e90cd454c22aee96244a7029b3ce55d0643b972163653b
|
Provenance
The following attestation bundles were made for qinstrument-1.0.1.tar.gz:
Publisher:
publish.yml on davidgrier/QInstrument
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qinstrument-1.0.1.tar.gz -
Subject digest:
d2d3f2821b79b0c801e938a594b41e2d4c904ae7cf2c790370f4a87a33ab3ce7 - Sigstore transparency entry: 1237961420
- Sigstore integration time:
-
Permalink:
davidgrier/QInstrument@a4519fcf7053547b5be6db647fb444b4dcca07ef -
Branch / Tag:
refs/tags/v1.0.1 - Owner: https://github.com/davidgrier
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a4519fcf7053547b5be6db647fb444b4dcca07ef -
Trigger Event:
push
-
Statement type:
File details
Details for the file qinstrument-1.0.1-py3-none-any.whl.
File metadata
- Download URL: qinstrument-1.0.1-py3-none-any.whl
- Upload date:
- Size: 89.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0445914e36e9a77fa7dacbff5bb8d433103538f650972c700d785798383c3725
|
|
| MD5 |
e0b7c2a2593419963982ea1bf670dbae
|
|
| BLAKE2b-256 |
342b8e418723c273799a7256588d21a1f3196cd614e586d522f9102a78a488ad
|
Provenance
The following attestation bundles were made for qinstrument-1.0.1-py3-none-any.whl:
Publisher:
publish.yml on davidgrier/QInstrument
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qinstrument-1.0.1-py3-none-any.whl -
Subject digest:
0445914e36e9a77fa7dacbff5bb8d433103538f650972c700d785798383c3725 - Sigstore transparency entry: 1237961427
- Sigstore integration time:
-
Permalink:
davidgrier/QInstrument@a4519fcf7053547b5be6db647fb444b4dcca07ef -
Branch / Tag:
refs/tags/v1.0.1 - Owner: https://github.com/davidgrier
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a4519fcf7053547b5be6db647fb444b4dcca07ef -
Trigger Event:
push
-
Statement type: