WSL2上のUbuntu20.04でPyQt6を使う(ファイル選択ダイアログも使用できました)

はじめに

WSL2上のUbuntu 20.04でPyQt6を使ってみました。

画像ファイルを選択して表示するだけのアプリを作ってみました。




普通にファイル選択ダイアログが開いたのでビックリしました。
Windows内のファイルに加えてWSL2内のファイルも選択可能です。

環境構築

Ubuntuに以下をインストールすると使えるようになりました。
詳細は後述の「参考にさせて頂いたサイト」を参照して下さい。

sudo apt install libxkbcommon-x11-0
sudo apt install libxcb-icccm4
sudo apt install libxcb-image0
sudo apt install libxcb-keysyms1
sudo apt install libxcb-render-util0
sudo apt install libxcb-xinerama0
sudo apt install libgl1-mesa-dev

以下の警告が出た場合にはこちらを参照して下さい。

/sbin/ldconfig.real: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link

Pythonスクリプト

from PyQt6 import QtCore
from PyQt6.QtWidgets import *
from PyQt6.QtGui import QImage, QPixmap

class Window(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("pyQt6 sample")
        self.setGeometry(50, 50, 660, 660)
        
        self.button1 = QPushButton('Open Img', self)
        self.button1.setGeometry(QtCore.QRect(20, 20, 100, 30))
    
        self.img_label1 = QLabel(self)
        self.img_label1.setGeometry(QtCore.QRect(74, 120, 512, 512))
        self.img_label1.setFrameStyle(QFrame.Shape.Box.value | QFrame.Shadow.Plain.value)

        self.button1.clicked.connect(self.showDialog1)
    
    def showDialog1(self):

        fname = QFileDialog.getOpenFileName(self, 'Open file')

        # fname[0]は選択したファイルのパス(ファイル名を含む)
        if fname[0]:
            # 画像の読み込み, サイズ変更
            image = QImage(fname[0]).scaled(self.img_label1.size(),QtCore.Qt.AspectRatioMode.KeepAspectRatio) 
            # 画像の表示
            self.img_label1.setPixmap(QPixmap.fromImage(image))

if __name__ == "__main__":
    app = QApplication([])
    ex =Window()
    ex.show()
    app.exec()

スクリプトの説明はこちらを参照して下さい。

参考にさせて頂いたサイト

2022年3月23日追記(スクリプトの改訂)

「constructGUI.py」を使ってPythonスクリプトを書き換えました。

「constructGUI.py」に関してはこちらを参照して下さい。
touch-sp.hatenablog.com

Pythonスクリプト

from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QWidget, QApplication, QLabel, QPushButton, QVBoxLayout, QFileDialog
from PyQt6.QtGui import QPixmap

from constructGUI import construct

class Window(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("pyQt6 sample")
        
        self.button1 = construct(QPushButton(), 'settings.yaml', 'button_1')
        self.img_label1 = construct(QLabel(), 'settings.yaml', 'label_1')    

        self.button1.clicked.connect(self.showDialog1)

        layout = QVBoxLayout()
        layout.addWidget(self.img_label1)
        layout.addWidget(self.button1)

        self.setLayout(layout)
    
    def showDialog1(self):

        fname = QFileDialog.getOpenFileName(self, 'Open file')

        # fname[0]は選択したファイルのパス(ファイル名を含む)
        if fname[0]:
            # 画像の読み込み, サイズ変更
            image = QPixmap(fname[0]).scaled(self.img_label1.size(), Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation) 
            # 画像の表示
            self.img_label1.setPixmap(image)

if __name__ == "__main__":
    app = QApplication([])
    ex =Window()
    ex.show()
    app.exec()

YAMLファイル

label_1:
  type: QLabel
  width: 512
  height: 512
  box: 1

button_1:
  type: QPushButton
  fontFamily: times
  fontBold: True
  text: Open Img