「PythonでGUIアプリ開発」の基礎 PyQt/PySide編 その11
「PythonでGUIアプリ開発」の基礎 PyQt/PySide編 その11以下は、リスト9●どんなプログラムでも必要な基本機能をメニューに実装しよう(pyqt07.py)に筆者が、コメントを追加したもの。# 「特集1 PythonでGUIアプリ開発」の基礎 PyQt/PySide編 その2## ステップ08 メニューに定番機能を実装##『日経ソフトウエア』2021年11月号(p.62~p.63)### リスト9●どんなプログラムでも必要な基本機能をメニューに実装しよう(pyqt07.py)## (1)import sys, webbrowserfrom PyQt6.QtGui import *from PyQt6.QtWidgets import *# 「QMainWindow」クラスを継承した「pyqt07」クラスを記述。class pyqt07(QMainWindow): # 「pyqt07」クラスのコンストラクタ(インスタンス生成時に # 呼び出されるメソッド)である「__init__」を記述。 def __init__(self): # 「pyqt07」クラスの親クラスである「QMainWindow」クラスのコンストラクタを実行するコード。 # この記述がないと必要な初期処理が実行されない。 super().__init__() # タイトルバー文字列の設定。 # 「pyqt07」クラスのインスタンスは、(12)で変数「w」に代入され、「w」という名前で # 参照できるが、その名前はクラスの外部のみからしか利用できない。クラス内部から自分 # 自身のインスタンスを呼び出すには、コンストラクタで指定した「self」という名前を使う。 # 「setWindowTitle」メソッドに与えた「self.__class__.__name__」は、このクラスの名前で、 # 中身は「pyqt07」。 self.setWindowTitle(self.__class__.__name__) # 同様に「self」を使って、ラベルウィジェットの位置と大きさを設定する。 self.setGeometry(100, 100, 250, 100) # (2) QMainWindow」クラスを継承した「pyqt07」クラスの「menuBar」メソッドを呼び出して、 # メニューバーのインスタンスを作り、それを「menu」という名前で参照できるようにする。 menu = self.menuBar() # (3) 「ファイル」メニューを追加し、それを「menuFile」という名前で参照できるようにする。 # 「&(アンパサンド)」の次の文字は「アクセスキー」になる。「Altキー」を押しながら # 「F」キーを押すと、「ファイル」メニューを開けるようになる。 menuFile = menu.addMenu('ファイル(&F)') # (4) メニュー項目に相当する「アクション」を作り、「menuFileExit」という名前で参照できるようにする。 # 「QAction」クラスのコンストラクタに渡す最初の引数はアイコンの指定で、ここではQtが持っている # 「SP_TitleBarCloseButton」を指定している。 # 続く引数は、メニュー項目の文字列( '終了(&X)')と親オブジェクト。 menuFileExit = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_TitleBarCloseButton)), '終了(&X)', menuFile) # (5) 「終了」メニューが選ばれた場合の処理として、「quit」を指定。 # 「quit」は、「QApplication」静的メソッドで、呼び出すとプログラムが終了する。 menuFileExit.triggered.connect(quit) # (6) 「menuFile」に「menuFileExit」アクションを追加する。 menuFile.addAction(menuFileExit) # (7) 「ヘルプ」メニューを生成して、「menuHelp」という名前で参照できるようにする。 menuHelp = menu.addMenu('ヘルプ(&H)') # (8) 「menuHelpWeb」メニューを生成して、「menuHelpWeb」という名前で参照できるようにする。 # このメニュー項目が選ばれた場合、(11)の「menuHelpWebClicked」メソッドを呼び出す。 menuHelpWeb = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_DialogHelpButton)), 'Webサイトを開く(&W)', menuHelp) menuHelpWeb.triggered.connect( self.menuHelpWebClicked) menuHelp.addAction(menuHelpWeb) # (9) メニューの区切り線(セパレータ)を追加するコード。 menuHelp.addSeparator() # (10) バージョン情報を追加するコード。 # そのイベントハンドラは、(12)。 menuHelpVersion = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_MessageBoxInformation)), 'バージョン情報(&V)', menuHelp) menuHelpVersion.triggered.connect( self.menuHelpVersionClicked) menuHelp.addAction(menuHelpVersion) # 「show」メソッドを呼び出して、表示する。 self.show() # (11) 「menuHelpWeb」メニュー項目が選ばれた場合のコード。 # 「webbrowser.open」関数を使うため、(1)で「webbrowser」モジュールをインポートしている。 def menuHelpWebClicked(self): webbrowser.open( 'https://info.nikkeibp.co.jp/media/NSW/') # (12) 実行をするとダイアログを出す。 # 「sys.version」、を使うために(1)で「sys」モジュールをインポートしている。 def menuHelpVersionClicked(self): s = self.__class__.__name__ s += ' Version 0.01(2021/08/25)\n' s += '@2021 Hideo Harada\n' s += 'with Python ' + sys.version QMessageBox.information( self, self.__class__.__name__, s) # プログラムを起動したときに最初に実行される。app = QApplication([])# 「pyqt07」クラスを生成すると、「def __init__(self):」が実行される。w = pyqt07()# これを実行することで、GUIの画面がユーザーに表示される。app.exec()リスト9(pyqt07)の実行結果「ヘルプ」メニューをクリックした結果(「alt」+「H」でも同様)「ヘルプ」メニューの「Webを開く」の実行結果。日経ソフトウエアの最新号が表示された。」「ヘルプ」メニューの「バージョン情報(V)」の実行結果。<おまけ>リスト9をJupiterNotebookで実行した結果。どういうわけか、JupiterNotebookでは、「終了(X)」メニューが機能しませんでした。「Webを開く(W)」、「バージョン情報(V)」は機能したのですが。