Last active
September 19, 2018 10:34
-
-
Save Towdium/88b504e975749397c7bc9bced864f068 to your computer and use it in GitHub Desktop.
A simple program to keep your neck and waist healthy
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from PyQt5 import QtGui, QtCore | |
from PyQt5.QtWidgets import QMainWindow, QApplication, QLCDNumber, QWidget, QGridLayout, QPushButton, \ | |
QGraphicsOpacityEffect | |
from PyQt5.QtCore import QTimer, QRect | |
from PyQt5.QtGui import QPainter, QPen, QRegion | |
from datetime import datetime, timedelta | |
import sys | |
''' | |
This short program might provide help to those with neck or waist problems | |
It helps you count time of work, and tells you to relax | |
Simply edit the following variables to customize the behavior | |
Have fun | |
''' | |
t_work = timedelta(hours=1) | |
t_relax = timedelta(minutes=10) | |
size = (80, 35) | |
class WControl(QWidget): | |
def __init__(self): | |
super().__init__() | |
self.widget = None | |
self.setLayout(QGridLayout()) | |
self.setMode(1) | |
def setMode(self, i): | |
if self.widget is not None: | |
self.layout().removeWidget(self.widget) | |
self.widget.setParent(None) | |
if i == 5: | |
i = 1 | |
def gen_button(s): | |
def r(): | |
button = QPushButton(s) | |
button.setMaximumHeight(40) | |
button.setMaximumWidth(80) | |
button.pressed.connect(lambda: self.setMode(i + 1)) | |
self.layout().addWidget(button) | |
self.layout().setContentsMargins(5, 5, 5, 5) | |
self.widget = button | |
return r | |
def gen_timer(t): | |
def ret(): | |
def func(): | |
time = t - (datetime.now() - self.start) | |
if time > timedelta(): | |
s = str(time)[-12:-7] | |
lcd.display(s) | |
else: | |
timer.stop() | |
timer.setParent(None) | |
self.setMode(i + 1) | |
self.start = datetime.now() | |
lcd = QLCDNumber() | |
lcd.setSegmentStyle(QLCDNumber.Flat) | |
self.layout().addWidget(lcd) | |
self.layout().setContentsMargins(0, 0, 0, 0) | |
timer = QTimer(self) | |
timer.timeout.connect(func) | |
timer.start(1000) | |
func() | |
self.widget = lcd | |
return ret | |
f = {1: gen_button('Start'), 2: gen_timer(t_work), 3: gen_button('Relax'), 4: gen_timer(t_relax)} | |
f[i]() | |
def mouseReleaseEvent(self, a0: QtGui.QMouseEvent) -> None: | |
super().mouseReleaseEvent(a0) | |
class WClose(QWidget): | |
def __init__(self): | |
super().__init__() | |
self.setFixedSize(*size) | |
self.hovered = False | |
self.setMask(QRegion(size[0] - 20, 0, 20, 20)) | |
def enterEvent(self, a0: QtCore.QEvent) -> None: | |
super().enterEvent(a0) | |
self.update() | |
def leaveEvent(self, a0: QtCore.QEvent) -> None: | |
super().leaveEvent(a0) | |
self.update() | |
def paintEvent(self, a0: QtGui.QPaintEvent) -> None: | |
super().paintEvent(a0) | |
if not self.underMouse(): | |
return | |
painter = QPainter(self) | |
painter.setRenderHint(QPainter.Antialiasing) | |
painter.fillRect(size[0] - 20, 0, size[0], 20, self.palette().color(self.backgroundRole())) | |
pen = QPen() | |
pen.setColor(self.palette().color(self.foregroundRole())) | |
pen.setWidth(2) | |
painter.setPen(pen) | |
painter.drawLine(size[0] - 15, 5, size[0] - 5, 15) | |
painter.drawLine(size[0] - 15, 15, size[0] - 5, 5) | |
def mouseReleaseEvent(self, a0: QtGui.QMouseEvent) -> None: | |
super().mouseReleaseEvent(a0) | |
if QRect(size[0] - 20, 0, 20, 20).contains(a0.pos()): | |
QApplication.quit() | |
class MainWindow(QMainWindow): | |
def __init__(self): | |
super().__init__() | |
self.timer = None | |
widget = QWidget() | |
layout = QGridLayout() | |
widget.setLayout(layout) | |
layout.addWidget(WControl()) | |
layout.setContentsMargins(0, 0, 0, 0) | |
self.opacity = QGraphicsOpacityEffect(self) | |
self.opacity.setOpacity(0.5) | |
self.setGraphicsEffect(self.opacity) | |
self.setWindowFlags(QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint) | |
self.setAttribute(QtCore.Qt.WA_TranslucentBackground) | |
self.point = None | |
self.setFixedSize(*size) | |
close = WClose() | |
close.setParent(widget) | |
self.setCentralWidget(widget) | |
def mouseMoveEvent(self, a0: QtGui.QMouseEvent) -> None: | |
super().mouseMoveEvent(a0) | |
self.move(a0.globalPos() - self.point) | |
def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None: | |
super().mousePressEvent(a0) | |
self.point = a0.pos() | |
def setTimer(self, a, b): | |
def stop(): | |
if self.timer is not None: | |
self.timer.stop() | |
self.timer.setParent(None) | |
def func(): | |
if a(self.opacity.opacity()): | |
self.opacity.setOpacity(b(self.opacity.opacity())) | |
else: | |
stop() | |
stop() | |
timer = QTimer() | |
timer.timeout.connect(func) | |
timer.start(20) | |
self.timer = timer | |
def enterEvent(self, a0: QtCore.QEvent) -> None: | |
super().enterEvent(a0) | |
self.setTimer(lambda a: a < 1, lambda a: a + 0.02) | |
def leaveEvent(self, a0: QtCore.QEvent) -> None: | |
super().leaveEvent(a0) | |
self.setTimer(lambda a: a > 0.5, lambda a: a - 0.02) | |
if __name__ == "__main__": | |
app = QApplication(sys.argv) | |
ui = MainWindow() | |
ui.show() | |
app.exec() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment