PythonでGUI PyQt6でメモ帳の作成

プログラミング

概要

PyQt6は、かなりしっかりしたライブラリとなっていて大きいですがサクサク動きます。
機能もかなりそろっていますので普通の使い方なら部品が無いってことはあまりないのではないでしょうか。

今回は、さっくりと使い方を紹介します。

の例では、Windows10で動作確認を行っています。

インストール方法

pip install pyqt6

で、インストールできます。

画面の表示

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QLineEdit, QPushButton

# アプリケーション作成
app = QApplication(sys.argv)

# メインウィンドウ作成
window = QMainWindow()
window.setWindowTitle("テキストボックスとボタン")
window.resize(400, 150)

# テキストボックスを作成
text_box = QLineEdit(window)
text_box.setPlaceholderText("ここにテキストを入力してください")
text_box.setGeometry(50, 50, 200, 30)  # (x, y, 幅, 高さ)

# ボタンを作成
button = QPushButton("押す", window)
button.setGeometry(260, 50, 80, 30)  # (x, y, 幅, 高さ)

# ボタンクリック時の動作
def button_clicked():
    text = text_box.text()  # テキストボックスの文字列
    print(f"入力されたテキスト: {text}")  # 出力

button.clicked.connect(button_clicked)  # クリック時の関数の呼び出し

# ウィンドウを表示
window.show()

# アプリケーションの実行
sys.exit(app.exec())

 

上のコードを実行すると以下の画面が表示されます。

QApplicationクラス

Windowやボタン等PyQt6のアプリケーションの管理をするクラスです。
まとめ役ですね。
かならず一つのインスタンスが必要でこの中でイベントループが回っています。

QMainWindowクラス

PyQt6でメインウィンドウを管理するクラスです。
ここに様々な部品を配置することができます。

関数の実行

自動レイアウト用の部品もあるんですが今回は、テキストボックスとボタンを座標とサイズを指定して配置してあります。
ボタンを押したときに動作する関数を

button.clicked.connect(button_clicked)

の様に定義するとボタンが押された時に実行される関数
button_clicked()
が動作してコンソールから起動した場合は、コンソールへテキストボックスに入力された文字が出力されます。

位置の指定

text_box.setGeometry(50, 50, 200, 30)  # (x, y, 幅, 高さ)

(50, 50, 200, 30) の内容について:

  • 最初の2つの引数は、テキストボックスの左上の座標です。
  • 座標は、左上隅が (0, 0) となり、そこからの位置を指定します。
  • 3つ目の引数が幅、4つ目の引数が高さを表しています。

イベントループ

コード上は、”app”と”window”は関連が無いようですが”window”は”app”のイベントループ内で表示されています。

app.exec()は、アプリケーションが終了するまでプログラムの実行を維持しており終了時に終了コードを返します。
そして、sys.exit()がOSへ終了コードを渡しています。

かんたんメモ帳 – メモ帳の作成

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit, QFileDialog, QMessageBox
from PyQt6.QtGui import QAction

class Notepad(QMainWindow):
    def __init__(self):
        super().__init__()

        # メインウィンドウ
        self.setWindowTitle("簡単 メモ帳")
        self.resize(500, 600)

        # テキストエディットウィジェット
        self.text_edit = QTextEdit(self)
        self.setCentralWidget(self.text_edit)

        # メニューを設定
        self.create_menu()

    def create_menu(self):
        # メニューバーを作成
        menubar = self.menuBar()

        # メニューバーにファイルメニューを追加
        file_menu = menubar.addMenu("ファイル")

        # メニューに新規作成アクションを追加
        create_action = QAction("新規作成", self)
        create_action.triggered.connect(self.new_file)
        file_menu.addAction(create_action)

        # メニューに開くアクションを追加
        open_action = QAction("開く", self)
        open_action.triggered.connect(self.open_file)
        file_menu.addAction(open_action)

        # メニューに保存アクションを追加
        save_action = QAction("保存", self)
        save_action.triggered.connect(self.save_file)
        file_menu.addAction(save_action)

    def new_file(self):
        # 新しいファイルを作成
        self.text_edit.clear()

    def open_file(self):
        # フィルダイアログでファイルを選択
        file_path, _ = QFileDialog.getOpenFileName(
            self, "ファイルを開く", "", "テキストファイル (*.txt);;すべてのファイル (*)")
        if file_path:
            with open(file_path, "r", encoding="utf-8") as file:
                content = file.read()
                self.text_edit.setPlainText(content)

    def save_file(self):
        # ファイルダイアログでファイルを保存
        file_path, _ = QFileDialog.getSaveFileName(
            self, "ファイルを保存", "", "テキストファイル (*.txt);;すべてのファイル (*)")
        if file_path:
            try:
                with open(file_path, "w", encoding="utf-8") as file:
                    content = self.text_edit.toPlainText()
                    file.write(content)
            except Exception as e:
                QMessageBox.critical(self, "エラー", f"ファイルの保存に失敗しました: {str(e)}")

# アプリケーションの実行
app = QApplication(sys.argv)
notepad = Notepad()
notepad.show()
sys.exit(app.exec())

 

このコードで下の画像のようなメモ帳が出来ます。

Notepadクラス

class Notepad(QMainWindow):
    --コード--

QMainWindowというWindowのクラスを継承して”Notepad”と言うWindowクラスを作っています。
コンストラクタ( def __init__(self) )内でWindowを作り、別に作成した”メニュー”もここで追加しています。

“def create_menu(self)”がメニューを組み立てる部分で、以下クラス内のほかのメソッドはメニューから”QAction”として呼び出される”新規作成”、”ファイルを開く”、”ファイルを保存”する機能です。

クラス外でやっていることはWindowの代わりにNotepadのインスタンスを作っているだけで最初の例と全く同じになります。

try: ~ except: ~

def save_file(self):
    コード

で、使われている try: ~ except: ~ は、
try: 以下のコードブロックを実行して、もしエラーが出て実行できない場合 except: 以下のコードブロックを実行します。
このことによってプログラムが停止してしまうことなく実行するようにできます。
また、”except Exception as e:” で”e”にエラーの内容が保存されますのでこれを出力することによってエラーの原因究明にも役立ちます。

QFileDialog

QFileDialog.getOpenFileName(
            self, "ファイルを開く", "", "テキストファイル (*.txt);;すべてのファイル (*)")

すこし、複雑に見えますがファイルを選択するダイアログの設定です。
ダイアログのタイトルやどんな拡張子のファイルを表示するかなどが設定されています。

まとめ

今回作ってみたメモ帳は、ごく簡単なものですがカスタマイズ次第でかなりのことができるようになりそうです。
特別な用途に沿ったものも出来そうなのでそういったものを作成したり、自作アプリにメモ帳を埋め込むなんてことにも使えますね。

また、基本はこのようにかんたんでもっと部品とその使い方を覚えればいろんなことができるようになりますよ。

次は、基本的ないくつかの部品を使った例を記事にする予定です。

Commnts