2
1

Python GUIアプリケーションでウィンドウや部品の半透明や透明を制御する(PyQt5)

Last updated at Posted at 2024-03-03

動作環境

  • macOS M1 デスクトップ
  • Ubuntu Desktop
  • Python3.10

GitHubで公開中

スリットを利用して、文章を読みやすくするPython GUIアプリケーションです

screenshot.png

PyQt5でGUIアプリケーションを作成

PyQt5を使用してウィンドウ内に半透明と透明のフレームが共存するGUIアプリケーションを作成するには、QFrameウィジェットの透明度を調整することが鍵となります。これを実現するには、setStyleSheetメソッドを使用してCSSスタイルを適用し、フレームの背景色と透明度を指定します。

pip install

$ pip install PyQt5

ソースコード

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QFrame, QVBoxLayout, QWidget
from PyQt5.QtCore import Qt, QPoint

class TransparentWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('透明ウィンドウ')
        self.setGeometry(0, 0, 1280, 400)
        # ウィンドウを中央に配置
        self.move(QApplication.desktop().screen().rect().center() - self.rect().center())


        self.setAttribute(Qt.WA_TranslucentBackground)  # 背景を透明にする
        self.setWindowFlags(Qt.FramelessWindowHint)  # ウィンドウの枠を非表示にする

        centralWidget = QWidget(self)
        self.setCentralWidget(centralWidget)
        layout = QVBoxLayout(centralWidget)

        semiTransparentFrame = QFrame(centralWidget)
        semiTransparentFrame.setStyleSheet("background-color: rgba(16, 160, 64, 160);")
        semiTransparentFrame.setFrameShape(QFrame.StyledPanel)
        layout.addWidget(semiTransparentFrame)

        transparentFrame = QFrame(centralWidget)
        transparentFrame.setStyleSheet("background-color: rgba(255, 255, 255, 0);")
        transparentFrame.setFrameShape(QFrame.StyledPanel)
        layout.addWidget(transparentFrame)

        semiTransparentFrame = QFrame(centralWidget)
        semiTransparentFrame.setStyleSheet("background-color: rgba(16, 160, 64, 160);")
        semiTransparentFrame.setFrameShape(QFrame.StyledPanel)
        layout.addWidget(semiTransparentFrame)

        # マウスイベント用の変数初期化
        self.oldPos = None
        self.isResizing = False

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.oldPos = event.globalPos()
        elif event.button() == Qt.RightButton:
            self.oldPos = event.globalPos()
            self.isResizing = True

    def mouseMoveEvent(self, event):
        if not self.oldPos:
            return
        if event.buttons() == Qt.LeftButton:
            delta = QPoint(event.globalPos() - self.oldPos)
            self.move(self.x() + delta.x(), self.y() + delta.y())
            self.oldPos = event.globalPos()
        elif event.buttons() == Qt.RightButton and self.isResizing:
            delta = event.globalPos() - self.oldPos
            self.resize(self.width() + delta.x(), self.height() + delta.y())
            self.oldPos = event.globalPos()

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.RightButton:
            self.isResizing = False

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = TransparentWindow()
    window.show()
    sys.exit(app.exec_())

アプリケーションの実行

$ python app.py

操作方法

  • 左クリック&ドロップでウィンドウの移動
  • 右クリック&ドロップでウィンドウのサイズ変更

Special Thanks

@daisukeokaoss さん、ありがとうございます。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1