【画像付き】PythonのGUI開発ライブラリ4選

PythonのGUI
  • URLをコピーしました!

当ブログのコンテンツ・情報について、できる限り正確な情報を提供するように努めておりますが、正確性や安全性を保証するものではありません。
当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますので、予めご了承ください。

この記事では、Pythonの初心者向けにGUIの基本概念と実装方法を解説します。Pythonには、GUIアプリケーションを簡単に作成できる多くのライブラリやフレームワークがあります。

特に、Tkinterは標準ライブラリとして提供されており、初心者にとって扱いやすいです。しかし、他にもPyQtKivywxPythonなどの強力なライブラリがあります。

この記事では、シンプルな電卓アプリのGUIをサンプルにそれぞれのライブラリを紹介します。

目次

この記事で使用するPythonライブラリ

この記事では以下のPythonライブラリを使用します。

ライブラリライセンス
TkinterPython標準モジュール
PyQtGPL、商用ライセンス(デュアルライセンス)
KivyMIT
wxPythonwxWidgets

Python GUIライブラリ4選

PythonでGUIを開発する際には、いくつかのライブラリから選択することができます。ここでは、代表的なPython GUIライブラリを紹介します。

Tkinter

TkinterはPythonの標準ライブラリとして提供されており、簡単なインターフェースを迅速に作成するのに適しています。軽量でありながら強力な機能を持ち、Python初心者がGUIプログラムの基本を学ぶのに最適です。

メリットデメリット
Pythonの標準ライブラリとして含まれているため、追加インストールが不要
シンプルで使いやすく、初心者にも理解しやすい
軽量で簡単なアプリケーションに適している
見た目が古い
デザインに限界がある
高度なUI設計やカスタマイズが難しい

以下はTkinterで設計した電卓アプリのGUIです。

Tkinterで設計した電卓アプリ
サンプルPythonコード
import tkinter as tk
from math import sqrt

class Calculator:
    def __init__(self, master):
        self.master = master
        master.title("電卓")
        master.geometry("472x601")
        self.result_var = tk.StringVar()

        self.result_display = tk.Entry(master, textvariable=self.result_var, font=('Arial', 24), bd=10, insertwidth=2, width=14, borderwidth=4)
        self.result_display.grid(row=0, column=0, columnspan=4)

        self.create_buttons()

    def create_buttons(self):
        button_texts = [
            ('7', 1, 0), ('8', 1, 1), ('9', 1, 2), ('/', 1, 3),
            ('4', 2, 0), ('5', 2, 1), ('6', 2, 2), ('*', 2, 3),
            ('1', 3, 0), ('2', 3, 1), ('3', 3, 2), ('-', 3, 3),
            ('0', 4, 0), ('.', 4, 1), ('%', 4, 2), ('+', 4, 3),
            ('C', 5, 0), ('=', 5, 1), ('√', 5, 2), ('^', 5, 3)
        ]

        for (text, row, col) in button_texts:
            self.create_button(text, row, col)

    def create_button(self, text, row, col):
        button = tk.Button(self.master, text=text, padx=20, pady=20, font=('Arial', 18), width=5, height=2, command=lambda: self.on_button_click(text))
        button.grid(row=row, column=col, sticky="nsew")

    def on_button_click(self, char):
        if char == 'C':
            self.result_var.set("")
        elif char == '=':
            try:
                expression = self.result_var.get().replace('%', '/100').replace('^', '**')
                self.result_var.set(str(eval(expression)))
            except Exception as e:
                self.result_var.set("エラー")
        elif char == '√':
            try:
                value = float(self.result_var.get())
                self.result_var.set(str(sqrt(value)))
            except Exception as e:
                self.result_var.set("エラー")
        else:
            current_text = self.result_var.get()
            new_text = current_text + str(char)
            self.result_var.set(new_text)

if __name__ == "__main__":
    root = tk.Tk()
    calculator = Calculator(root)
    root.mainloop()

PyQt

PyQt(公式サイト)は、クロスプラットフォームのGUIライブラリであるQtのPythonバインディングです。豊富なウィジェットと高度な機能を備えており、商用アプリケーションの開発にも適しています。

メリットデメリット
モダンなUIデザインが可能
商用アプリケーションの開発にも対応
豊富なウィジェットと高度な機能を提供
ライセンスが商用利用時に制限されることがある
他のGUIライブラリに比べて覚えることが多い

PyQtのインストール

PowerShellで以下のコマンドを実行してください。

pip install PyQt5

以下はPyQtで設計した電卓アプリのGUIです。

PyQtで設計した電卓アプリ
サンプルPythonコード
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QGridLayout, QPushButton, QLineEdit
from math import sqrt

class Calculator(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("電卓")
        self.setGeometry(100, 100, 472, 400)

        vbox = QVBoxLayout()

        self.result_display = QLineEdit(self)
        self.result_display.setReadOnly(True)
        self.result_display.setStyleSheet("font-size: 24px; padding: 10px;")
        vbox.addWidget(self.result_display)

        grid = QGridLayout()
        button_texts = [
            ('7', 1, 0), ('8', 1, 1), ('9', 1, 2), ('/', 1, 3),
            ('4', 2, 0), ('5', 2, 1), ('6', 2, 2), ('*', 2, 3),
            ('1', 3, 0), ('2', 3, 1), ('3', 3, 2), ('-', 3, 3),
            ('0', 4, 0), ('.', 4, 1), ('%', 4, 2), ('+', 4, 3),
            ('C', 5, 0), ('=', 5, 1), ('√', 5, 2), ('^', 5, 3)
        ]

        for (text, row, col) in button_texts:
            button = QPushButton(text, self)
            button.setStyleSheet("font-size: 18px; padding: 15px;")
            button.clicked.connect(lambda _, b=text: self.on_button_click(b))
            grid.addWidget(button, row, col)

        vbox.addLayout(grid)
        self.setLayout(vbox)

    def on_button_click(self, char):
        if char == 'C':
            self.result_display.clear()
        elif char == '=':
            try:
                expression = self.result_display.text().replace('%', '/100').replace('^', '**')
                self.result_display.setText(str(eval(expression)))
            except Exception as e:
                self.result_display.setText("エラー")
        elif char == '√':
            try:
                value = float(self.result_display.text())
                self.result_display.setText(str(sqrt(value)))
            except Exception as e:
                self.result_display.setText("エラー")
        else:
            current_text = self.result_display.text()
            new_text = current_text + str(char)
            self.result_display.setText(new_text)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    calculator = Calculator()
    calculator.show()
    sys.exit(app.exec_())

Kivy

Kivy(公式サイト)は、マルチタッチ対応のクロスプラットフォームGUIフレームワークで、モバイルデバイスやデスクトップアプリケーションの開発に適しています。モダンなUI/UXを実現するための多くの機能を提供します。

メリットデメリット
MITライセンスであるため、制限が緩い
マルチタッチとマルチプラットフォームに対応
モバイルアプリケーションの開発にも適している
モダンでカスタマイズ可能なUI設計が可能
他のライブラリと比べてリソースが重い
設計が他のライブラリと大きく異なる

Kivyのインストール

PowerShellで以下のコマンドを実行してください。(Windowsの場合)

pip install kivy[base] kivy[angle]

以下はKivyで設計した電卓アプリのGUIです。

Kivyで設計した電卓アプリ
サンプルPythonコード
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from math import sqrt

class CalculatorApp(App):
    def build(self):
        # padding=[left, top, right, bottom]
        root_layout = BoxLayout(orientation='vertical', padding=[10, 10, 10, 10], spacing=10)
        
        self.result_var = ""
        
        # Display
        self.result_display = TextInput(font_size=32, readonly=True, halign="right", multiline=False, size_hint_y=0.2)
        root_layout.add_widget(self.result_display)
        
        # Button layout
        button_layout = GridLayout(cols=4, spacing=10, size_hint_y=0.8)
        
        button_texts = [
            '7', '8', '9', '/', 
            '4', '5', '6', '*', 
            '1', '2', '3', '-', 
            '0', '.', '%', '+',
            'C', '=', '√', '^'
        ]

        for text in button_texts:
            button = Button(text=text, font_size=24, on_press=self.on_button_click)
            button_layout.add_widget(button)
        
        root_layout.add_widget(button_layout)
        
        return root_layout

    def on_button_click(self, instance):
        char = instance.text
        if char == 'C':
            self.result_var = ""
            self.result_display.text = self.result_var
        elif char == '=':
            try:
                expression = self.result_var.replace('%', '/100').replace('^', '**')
                self.result_var = str(eval(expression))
                self.result_display.text = self.result_var
            except Exception as e:
                self.result_display.text = "エラー"
        elif char == '√':
            try:
                value = float(self.result_var)
                self.result_var = str(sqrt(value))
                self.result_display.text = self.result_var
            except Exception as e:
                self.result_display.text = "エラー"
        else:
            self.result_var += char
            self.result_display.text = self.result_var

if __name__ == '__main__':
    CalculatorApp().run()

wxPython

wxPython(公式サイト)は、ネイティブの外観と操作性を提供するクロスプラットフォームのGUIライブラリです。柔軟性が高く、複雑なアプリケーションの開発にも適しています。

メリットデメリット
ネイティブの見た目と操作性
クロスプラットフォーム対応
柔軟で豊富なウィジェットセットが用意されている
セットアップが複雑
ドキュメントやリソースが少ない

wxPythonのインストール

PowerShellで以下のコマンドを実行してください。

pip install wxPython

wxWidgetsライセンスとは?

wxPythonはwxPythonというライセンスで提供されています。wxPythonはLGPLライセンスに似たライセンスですが、特定の条件下での例外が含まれています。主な特徴は以下の通りです。

  • 使用して作成された商用アプリケーションの配布が可能
  • 静的にリンク(コンパイル時に使用されるライブラリのコードを実行ファイルに組み込む方法)した場合でも、アプリケーションコードがオープンソースである必要はない
  • 利用したアプリケーションを独自のライセンスで配布することが許可されている

以下はwxPythonで設計した電卓アプリのGUIです。

wxPythonで設計した電卓アプリ
サンプルPythonコード
import wx
from math import sqrt

class Calculator(wx.Frame):
    def __init__(self, parent, title):
        super().__init__(parent, title=title, size=(472, 601))
        
        self.panel = wx.Panel(self)
        self.result_var = wx.TextCtrl(self.panel, style=wx.TE_RIGHT | wx.TE_READONLY, size=(440, 70))
        self.result_var.SetFont(wx.Font(24, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))

        main_sizer = wx.BoxSizer(wx.VERTICAL)
        main_sizer.Add(self.result_var, 0, wx.EXPAND | wx.ALL, 10)

        button_sizer = wx.GridSizer(5, 4, 10, 10)
        button_texts = [
            ('7', 1, 0), ('8', 1, 1), ('9', 1, 2), ('/', 1, 3),
            ('4', 2, 0), ('5', 2, 1), ('6', 2, 2), ('*', 2, 3),
            ('1', 3, 0), ('2', 3, 1), ('3', 3, 2), ('-', 3, 3),
            ('0', 4, 0), ('.', 4, 1), ('%', 4, 2), ('+', 4, 3),
            ('C', 5, 0), ('=', 5, 1), ('√', 5, 2), ('^', 5, 3)
        ]

        for (text, row, col) in button_texts:
            button = wx.Button(self.panel, label=text, size=(100, 70))
            button.SetFont(wx.Font(18, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))
            button.Bind(wx.EVT_BUTTON, lambda event, char=text: self.on_button_click(char))
            button_sizer.Add(button, 0, wx.EXPAND)
        
        main_sizer.Add(button_sizer, 1, wx.EXPAND | wx.ALL, 10)
        self.panel.SetSizer(main_sizer)
        self.Centre()
        self.Show()

    def on_button_click(self, char):
        current_text = self.result_var.GetValue()
        
        if char == 'C':
            self.result_var.SetValue("")
        elif char == '=':
            try:
                expression = current_text.replace('%', '/100').replace('^', '**')
                result = str(eval(expression))
                self.result_var.SetValue(result)
            except Exception:
                self.result_var.SetValue("エラー")
        elif char == '√':
            try:
                value = float(current_text)
                self.result_var.SetValue(str(sqrt(value)))
            except Exception:
                self.result_var.SetValue("エラー")
        else:
            new_text = current_text + char
            self.result_var.SetValue(new_text)

if __name__ == "__main__":
    app = wx.App(False)
    Calculator(None, title="電卓")
    app.MainLoop()

まとめ

PythonでGUIアプリケーションを作成する際には、さまざまなライブラリを選ぶことができます。

Tkinterは簡単で扱いやすく、初心者に最適です。PyQtは強力で、商用アプリケーションに適しています。Kivyはマルチタッチ対応で、モダンなインターフェースのアプリを作成するのに便利です。wxPythonはネイティブの外観を重視する場合に適しています。

これらのツールを使い分けることで、プロジェクトの要件に最も適したGUIアプリケーションを開発することができます。PythonでのGUI開発を始める際には、自分に合ったライブラリを選び、実際にコードを書いて試してみましょう。

よかったらシェアしてね!
  • URLをコピーしました!
目次