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_()
ちゃんと表示された!
他のこともやってみる!
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の開発をしてゆきたいと思いました。
- 前の記事
Python演算子オーバーロード 2019.10.11
- 次の記事
Pythonの変数アノテーション 2019.10.12