はじめに
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()
スクリプトの説明はこちらを参照して下さい。
参考にさせて頂いたサイト
- PyQt5をUbuntuで使うときにGUI周りでエラー (WSL2) - Qiita
- ImportError: libGL.so.1: cannot open shared object file: No such file or directory への対策 - Qiita
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