PyQtを使ってみる

PyQtを使ってみる

tkinterが使えない

Python3.7.3に更新し、さらにmacのOSを10.14.6に更新したら使えなくなった。tkで書いたコードを実行したらmacがクラッシュしました。もしかして、私のパソコン、壊れたの?

そう心配してググってみました。

Apple公式によると(最終閲覧は2019年10月11日)、どうやら私だけではなかったようです。

良かったぁ……。

じゃないんですけどね!

PyQtを使うしかない

いろいろとPythonでGUIを使うために調べましたが、どうやらPyQtが良いということが分かりました。

読み方は「パイキューティー」です。「パイキュート」とか読んでいる人は全然グローバルじゃないし、ガラパゴスだし、恥ずかしいのでやめましょう(ただし、公式では「キュート」と呼んでいるようです。GIF論争に似たものがある

世界の流行はkivy(カイヴィー。キビーはガラパゴス)らしいですけど、わざわざkivy語を覚えるのは嫌だったので、Tkinter(ティーケーインター。ティーキンターはガラパゴス)にもそれなりに近いPyQtをすることにしました。

コードと出力例は以下になります。

import sys
from PyQt5.QtWidgets import(
    QMainWindow, QApplication
)


class MyWindow(QMainWindow):

    def __init__(self):

        super(MyWindow, self).__init__()
        self.initUI()


    def initUI(self):

        self.resize(250, 150)
        self.setWindowTitle('MyWindow')
        self.show()



if __name__ == '__main__':

    app = QApplication(sys.argv)
    w = MyWindow()
    app.exec_()
PyQtの出力例

ちゃんと表示された!

他のこともやってみる!

import sys
from PyQt5.QtWidgets import(
    QMainWindow, QAction, QApplication, QMessageBox
)


class MyWindow(QMainWindow):

    def __init__(self):

        super(MyWindow, self).__init__()
        self.initUI()


    def initUI(self):

        # メニューバーを表示
        self.show_menubar()

        # ステータスバーを表示
        self.statusBar().showMessage('ステータスバーが表示されるよ!')

        self.resize(500, 500)
        self.setWindowTitle('MyWindow')
        self.show()


    def show_menubar(self):

        exitAction = QAction('&Exit', self)
        exitAction.triggered.connect(self.exit)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAction)


    def exit(self):

        # macだと、第2引数の「終了のまえに」が表示されない
        QMessageBox.information(self, '終了のまえに', 'OKを押すと終了します')
        self.close()



if __name__ == '__main__':

    app = QApplication(sys.argv)
    w = MyWindow()
    app.exec_()

あれ、メニューちゃんと表示されないじゃん!(背景は気にしないでください)

そうなったのでいつものようにググってみます。

スタックオーバーフローによると(最終閲覧は2019年10月11日)、どうやらmacだとそのままのコードでは表示してくれないみたい。

というわけで次のように書き換える。結果はコードの下にあります。

...
    def show_menubar(self):

        exitAction = QAction('&Exit', self)
        exitAction.triggered.connect(self.exit)

        menubar = self.menuBar()
        # macの場合はこれを書かないとちゃんと動作しないよ
        from platform import system
        if system() == 'Darwin':
            menubar.setNativeMenuBar(False)
            del system
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAction)

...

ちゃんと表示できた!

実際のところは「if system() == 'Darwin':」なんていらないんですけど、もしWindowsでも動かしたくなったら、この文章がないと面倒なことになるので、リスクヘッジのために書いておきました。

しかし、macの場合、「QMessageBox.information」でタイトルは表示されません。「File > Exit」で出てくるポップアップはこんな感じになってしまいます。

Qtの公式文章によると(最終閲覧は2019年10月11日)、これはmacの仕様上の問題だということです。WindowsやLinuxなどではこういったことは起こりません。

今後の展開

Python3.8もそろそろ出てくるらしいですが、それまで来るかも分からないtkinterの更新を待つのは億劫なので、これはからは、PyQtを使ってGUIの開発をしてゆきたいと思いました。