# -*- coding: utf-8 -*- import os import sys import time from PyQt5.QtCore import Qt, QEvent, QThread, pyqtSignal, QRect, QRectF, QTimer, QPoint from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget, QLabel from PyQt5.QtGui import QIcon, QPixmap, QPainter if sys.platform == "win32": pipe_path = '\\\\.\\pipe\\oneshot-journal-to-game' else: pipe_path = '/tmp/oneshot-pipe' try: base_path = sys._MEIPASS except AttributeError: base_path = os.path.abspath('.') class WatchPipe(QThread): change_image = pyqtSignal(str) def run(self): while True: while True: if os.path.exists(pipe_path): break else: time.sleep(0.1) pipe = open(pipe_path, 'r') pipe.flush() while True: if not os.path.exists(pipe_path): break # Handle game quitting cleanup message = os.read(pipe.fileno(), 256) if len(message) > 0: self.change_image.emit(message.decode()) time.sleep(0.05) class Journal(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.mousedown = False self.mousedownpos = QPoint(0, 0) self.label = QLabel(self) self.change_image('default_en') self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint) self.setAttribute(Qt.WA_TranslucentBackground) self.setMouseTracking(True) self.setWindowTitle('') self.setMinimumSize(800, 600) self.setMaximumSize(800, 600) self.setGeometry(0, 0, 800, 600) self.show() def mousePressEvent(self, event): self.mousedown = True self.mousedownpos = event.pos() def mouseReleaseEvent(self, event): self.mousedown = False def mouseMoveEvent(self, event): if event.buttons() == Qt.LeftButton: pos = event.pos() frameGm = self.frameGeometry() self.setGeometry(frameGm.x() + pos.x() - self.mousedownpos.x(), frameGm.y() + pos.y() - self.mousedownpos.y(), 800, 600) def change_image(self, image): name, lang = image.split('_', 1) img = os.path.join(base_path, 'images', lang.upper(), '{}.png'.format(name)) if not os.path.exists(img): img = os.path.join(base_path, 'images', '{}.png'.format(name)) if not os.path.exists(img): return self.pixmap = QPixmap(img) # XXX Use QImage instead to support transparency! self.label.setPixmap(self.pixmap) class Niko(QWidget): def __init__(self, *args, **kwargs): self.start_x, self.start_y = kwargs['start_x'], kwargs['start_y'] self.screen_width, self.screen_height = kwargs['screen_width'], kwargs['screen_height'] del kwargs['start_x'], kwargs['start_y'], kwargs['screen_width'], kwargs['screen_height'] super().__init__(*args, **kwargs) self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint) self.setAttribute(Qt.WA_TranslucentBackground) self.setMouseTracking(True) self.setWindowTitle('') self.setMinimumSize(self.screen_width, self.screen_height) self.setMaximumSize(self.screen_width, self.screen_height) self.setGeometry(0, 0, self.screen_width, self.screen_height) self.frames = [QPixmap(os.path.join(base_path, 'images', 'niko{}.png'.format(n)) for n in range(1,4))] self.setBackgroundRole(QPalette.Base) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) if __name__ == '__main__': app = QApplication(sys.argv) if len(sys.argv) == 3: # "Niko-leaves-the-screen" mode x, y = int(sys.argv[1]), int(sys.argv[2]) screensize = app.primaryScreen().size() niko = Niko(start_x = x, start_y = y, screen_width = screensize.width(), screen_height = screensize.height()) else: # Author's Journal mode journal = Journal() thread = WatchPipe() thread.change_image.connect(journal.change_image) thread.start() app.exec_()