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

この記事では、Pythonの初心者向けにGUIの基本概念と実装方法を解説します。Pythonには、GUIアプリケーションを簡単に作成できる多くのライブラリやフレームワークがあります。
特に、Tkinterは標準ライブラリとして提供されており、初心者にとって扱いやすいです。しかし、他にもPyQtやKivy、wxPythonなどの強力なライブラリがあります。
この記事では、シンプルな電卓アプリのGUIをサンプルにそれぞれのライブラリを紹介します。
この記事で使用するPythonライブラリ
この記事では以下のPythonライブラリを使用します。
Python GUIライブラリ4選
PythonでGUIを開発する際には、いくつかのライブラリから選択することができます。ここでは、代表的なPython GUIライブラリを紹介します。
Tkinter
TkinterはPythonの標準ライブラリとして提供されており、簡単なインターフェースを迅速に作成するのに適しています。軽量でありながら強力な機能を持ち、Python初心者がGUIプログラムの基本を学ぶのに最適です。
| メリット | デメリット | 
|---|---|
| Pythonの標準ライブラリとして含まれているため、追加インストールが不要 シンプルで使いやすく、初心者にも理解しやすい 軽量で簡単なアプリケーションに適している  | 見た目が古い デザインに限界がある 高度なUI設計やカスタマイズが難しい  | 
以下はTkinterで設計した電卓アプリのGUIです。

サンプル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です。

サンプル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です。

サンプル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 wxPythonwxWidgetsライセンスとは?
wxPythonはwxPythonというライセンスで提供されています。wxPythonはLGPLライセンスに似たライセンスですが、特定の条件下での例外が含まれています。主な特徴は以下の通りです。
- 使用して作成された商用アプリケーションの配布が可能
 - 静的にリンク(コンパイル時に使用されるライブラリのコードを実行ファイルに組み込む方法)した場合でも、アプリケーションコードがオープンソースである必要はない
 - 利用したアプリケーションを独自のライセンスで配布することが許可されている
 
以下はwxPythonで設計した電卓アプリのGUIです。

サンプル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開発を始める際には、自分に合ったライブラリを選び、実際にコードを書いて試してみましょう。