Skip to content

Instantly share code, notes, and snippets.

@Towdium
Last active September 19, 2018 10:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Towdium/88b504e975749397c7bc9bced864f068 to your computer and use it in GitHub Desktop.
Save Towdium/88b504e975749397c7bc9bced864f068 to your computer and use it in GitHub Desktop.
A simple program to keep your neck and waist healthy
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