はじめに
LinuxやPython界隈ではバージョンアップでハマることが多いですね。ラズパイStretchでPython3.5のコードを使っていましたが、アップグレードやらなにやらしているうちに、USBに繋いだArduinoを認識しなくなり、仕方なしにBookwormを再インストールしたら、仮想環境でないとPythonが使えなくなっていたり、Python3.5にライブラリがpip installできなくなっていたり・・・numpyすら入らなかったです。Cythonのバージョンを下げても何してもダメでした。私の力量不足ですが。
そこで、いっそのことPython3.5で書かれたコードをBookwormで標準のPython3.12へ書き換えることに。PyQt5もpip installできず、PyQt6にバージョンアップすることになりました。PyQt5とPyQt6であまり変更はないという話がちらほらありますが、実際は結構違うように思います。備忘録的に変更点を記します。
準備
2024年時点で最新のRaspberry Pi osはBookworm。Raspberry Pi 3Bでも問題なく使える。ラズパイに限らず、Bookwormだと仮想環境でないとpipが使えないようになった模様。
sudo apt update
sudo apt upgrade
sudo reboot now
cd
python3 -m venv python3.12
仮想環境に入る際は
source python3.12/bin/activate
プロンプトの前に(python3.12)と付くので仮想環境に入ったことが確認できる。
仮想環境を終了するときは
deactivate
で終了する。
source python3.12/bin/activate
pip install PyQt6
PyQt5とPyQt6の変更点
インポート
あまり差はない。5を6に。
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog
import sys
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtWidgets import QMainWindow, QApplication, QFileDialog
.exec_() → .exec()
.exec_()とアンダーバーが付いている箇所からアンダーバーを取る。
app = QtWidgets.QApplication(sys.argv)
sys.exit(app.exec_())
app = QtWidgets.QApplication(sys.argv)
sys.exit(app.exec())
その他
属性(attribute)エラーがでるので
tabWidget = QtWidgets.QTabWidget(self.centralwidget)
tabWidget.setFocusPolicy(QtCore.Qt.TabFocus)
tabWidget.setTabPosition(QtWidgets.QTabWidget.North)
tabWidget.setTabShape(QtWidgets.QTabWidget.Triangular)
tabWidget = QtWidgets.QTabWidget(self.centralwidget)
tabWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.TabFocus)
tabWidget.setTabPosition(QtWidgets.QTabWidget.TabPosition.North)
tabWidget.setTabShape(QtWidgets.QTabWidget.TabShape.Triangular)
こんな感じで書き換えていく。
変更点がありすぎて網羅することは難しいが、例えばPyQt5でQt.AlignCenterだとattribute errorとなる。そんな時はQt公式で、"Qt.AlignCenter"を検索。
Qt::AlignCenterの項で、項目名としてenum Qt::AlignmentFlagとあり、
PyQt6では、Qt.AlignmentFlag.AlignCenterとなる。
その他、継承元の変更もあり、QactionがQtWidgetsからQtGuiに移動。
QtWidgets.QAction()
QtGui.QAction()
下記によると、他にもあるようだ。
https://help.autodesk.com/view/MAYADEV/2025/JPN/?guid=Qt6Migration
余談
シリンジポンプ(3連)を自作していて、Poseidonを使っていました。なぜUSB接続のArduinoが認識されなくなったか全くの謎ですが、OS再インストールでUSB認識が復活し、PythonコードもPython3.5(PyQt5)からPython3.12(PyQt6)に書き換えられ、無事、ステッピングモーターが動きました。Poseidonにはカメラを使う機能があり、私はカメラを使わないのですが、もし使うとしたらOpenCVがバージョンアップしているので結構苦労しそうですね。