import sys import winput from PySide2.QtCore import Qt from PySide2.QtWidgets import QApplication, QMainWindow, QRadioButton, QGroupBox from PySide2.QtWidgets import QVBoxLayout, QHBoxLayout, QWidget, QLabel, QSpinBox from PySide2.QtWidgets import QAction from PySide2.QtGui import QIcon WM_MOUSEWHEEL = 0x020A # mouse wheel moved class ArtyWidget(QWidget): def __init__(self, parent=None): super().__init__(parent) self.radio_type1 = QRadioButton("Type 1: MILRAD 622 - 978") self.radio_type2 = QRadioButton("Type 2: MILRAD 800 - 1120") gbox_layout = QVBoxLayout() gbox_layout.addWidget(self.radio_type1) gbox_layout.addWidget(self.radio_type2) self.gbox = QGroupBox("Settings (Ctrl+H to hide the window bar)") self.gbox.setLayout(gbox_layout) self.target_range = QSpinBox() self.target_range.setMinimum(100) self.target_range.setMaximum(1600) self.elevation = QSpinBox() self.elevation.setReadOnly(True) font = self.elevation.font() font.setPointSize(14) self.target_range.setFont(font) self.elevation.setFont(font) self.radio_type1.toggled.connect(self.toggle_type) self.radio_type1.setChecked(True) self.target_range.valueChanged.connect(self.update_elevation) layout = QHBoxLayout() layout.addWidget(QLabel("Range:")) layout.addWidget(self.target_range) layout.addWidget(QLabel("Elevation:")) layout.addWidget(self.elevation) main_layout = QVBoxLayout() main_layout.addWidget(self.gbox) main_layout.addLayout(layout) self.setLayout(main_layout) def toggle_type(self): if self.radio_type1.isChecked(): self.elevation.setMinimum(622) self.elevation.setMaximum(978) else: self.elevation.setMinimum(800) self.elevation.setMaximum(1120) self.update_elevation(self.target_range.value()) def update_elevation(self, value): x0, x1 = 100, 1600 if self.radio_type1.isChecked(): y0, y1 = 978, 622 else: y0, y1 = 1120, 800 elevation = round(self.interpolator(value, x0, x1, y0, y1)) self.elevation.setValue(elevation) def interpolator(self, x, x0, x1, y0, y1): return y0 + (y1 - y0) * (x - x0) / (x1 - x0) def increment_range(self, mouse_event): if mouse_event.action == WM_MOUSEWHEEL: if not self.isActiveWindow(): current_range = self.target_range.value() increment = mouse_event.additional_data self.target_range.setValue(current_range + increment) class ArtyGUI(QMainWindow): def __init__(self, parent=None): super().__init__(parent) self.arty_widget = ArtyWidget(self) self.setCentralWidget(self.arty_widget) self.setWindowTitle("Arty") self.setWindowIcon(QIcon("icon.png")) self.setWindowFlag(Qt.WindowStaysOnTopHint) self.resize(150, 20) self.hideBarAction = QAction('&Hide Window Bar', self) self.hideBarAction.setShortcut('Ctrl+H') self.hideBarAction.triggered.connect(self.hide_bar) self.addAction(self.hideBarAction) self.quitAction = QAction('&Quit', self) self.quitAction.setShortcut('Ctrl+Q') self.quitAction.triggered.connect(qApp.quit) self.addAction(self.quitAction) self.arty_widget.target_range.setFocus() def hide_bar(self): self.setWindowFlag(Qt.FramelessWindowHint) self.arty_widget.gbox.setTitle("Settings (Ctrl+Q to quit)") self.show() self.arty_widget.target_range.setFocus() def wheelEvent(self, event): self.arty_widget.target_range.event(event) if __name__ == "__main__": app = QApplication(sys.argv) arty_gui = ArtyGUI() arty_gui.show() winput.hook_mouse(arty_gui.arty_widget.increment_range) sys.exit(app.exec_())