PythonのGUIツールキット「Tkinter」の簡単な使い方

2019年12月2日

みなさまおはこんばんにちは、せなです

今回はPythonのGUIツールキット「Tkinter」の使い方を解説したいと思います

Tkinterとは

TkinterはPythonで「Tcl/Tk」を扱うために標準で用意されているGUIライブラリです

「Tcl/Tk」を簡単に説明しておきますと

  • Tcl(ティクル):シンプルな構造をしているスクリプト言語
  • Tk(ティーケー):TclでGUIを開発するためのツールキット

「Tcl/Tk」はGUI開発での使用には根強い人気があり、RubyやPerlなどの言語にも利用されています

クロスプラットフォームな構造をしているのでWindows、Mac OS、Linuxなどの主要なOSには対応しています

Tkinterのメリット・デメリット

メリット

最大のメリットは、「Pythonに標準で付属されている」という点だと思います

Pythonインストール後にほかの余計なことを行わなくてもよいので、初心者の方が「視覚的に動くものを作りたい!」となった時にオススメできます

デメリット

UIパーツの配置が多いと、コードが煩雑になりレイアウトを読み取りにくくなる

ほかのGUIライブラリと比べると機能面が弱く、複雑な機能の実装が苦手

Tkinterは冒頭で少し触れていますがTclという言語を使用しています

Tclは非常に古い言語ですので情報がほとんどありません
そのため、あまり起きませんが問題が発生したときに自分で解決しなくてはいけなくなる可能性もあります(大抵は面倒なのでスルーしますが…)

メインウィンドウ:Tk()

Tkinterを使用する際に最も重要なのが「Tk()」関数です
Tk()を使用することでメインとなるウィンドウを作成することができます

import tkinter

# ウィンドウ
window = tkinter.Tk()
window.title('Sample Tkinter')
window.geometry('480x480')

window.mainloop()
Tkinter メインウィンドウ表示

ラベル:Label()

ラベルを作成したい場合はLabel(text='ラベル名')を使用します

作成したラベルに対して「pack()」を使用すると画面内に表示されます
place(x=x地点, y=y地点)」を使用すると自由な場所へ配置することもできます

import tkinter

# ウィンドウ
window = tkinter.Tk()
window.title('Sample Tkinter')
window.geometry('480x480')

# ラベル
label = tkinter.Label(text='label pack')
label.pack()
label_2 = tkinter.Label(text='label_2 place')
label_2.place(x=200, y=200)

window.mainloop()
Tkinter ラベルの設置

入力ボックス:Entry()

入力ボックスを作成するには「Entry(width=幅)」を使用します

import tkinter

# ウィンドウ
window = tkinter.Tk()
window.title('Sample Tkinter')
window.geometry('480x480')

# ボックス
entry = tkinter.Entry(width=60)
entry.pack()

window.mainloop()
Tkinter 入力ボックスの設置

値の削除を行いたい時には「entry.delete(0, tkinter.END)」でできます

値を取得したい時には「entry.get()」で取得できます

ボタン:Button()

ボタンを作成するには「Button(text='ボタン名', width=幅)」を使用します

import tkinter

# ウィンドウ
window = tkinter.Tk()
window.title('Sample Tkinter')
window.geometry('480x480')

# ボタン
button = tkinter.Button(text='ボタン', width=60)
button.pack()

window.mainloop()
Tkinter ボタンの設置

ボタンを押下したときにアクションを行いたい時には「bind('クリック番号', 関数名orアクション)」を使用します

import tkinter
from tkinter import messagebox

# メッセージボックス表示
def hello_window(event):
    messagebox.showinfo('Hello', 'Hello Tkinter')

# ウィンドウ
window = tkinter.Tk()
window.title('Sample Tkinter')
window.geometry('480x480')

# ボタン
button = tkinter.Button(text='ボタン', width=60)
button.bind('<Button-1>', hello_window)
button.pack()

window.mainloop()
Tkinter ボタンクリック後のメッセージボックス

クリック番号は

  • '<Button-1>’:クリック
  • '<Button-2>’:ホイールクリック
  • '<Button-3>’:右クリック

にそれぞれ対応しています

チェックボックス:Checkbutton()

チェックボックスは「Checkbutton(text='チェック名', variable='Boolean')」を使用します

長くなりますので、以下にソースコードを記述しておきます

import tkinter
from tkinter import messagebox

# ウィンドウ
window = tkinter.Tk()
window.title('Sample Tkinter')
window.geometry('480x480')

# チェックボックス入力真偽値判定
def check_boolean(event):
    message = ''
    if bool_1.get():
        message += 'No.1はチェックされている\n'
    else:
        message += 'No.1はチェックされていない\n'
    if bool_2.get():
        message += 'No.2はチェックされている\n'
    else:
        message += 'No.2はチェックされていない\n'
    if bool_3.get():
        message += 'No.3はチェックされている'
    else:
        message += 'No.3はチェックされていない'
    messagebox.showinfo('Check Boolean', message)


# チェック判定用変数
bool_1 = tkinter.BooleanVar()
bool_2 = tkinter.BooleanVar()
bool_3 = tkinter.BooleanVar()

# チェックボックス初期値
bool_1.set(False)
bool_2.set(False)
bool_3.set(False)

# チェックボックスの生成
checkbutton_1 = tkinter.Checkbutton(text='No.1', variable=bool_1)
checkbutton_1.pack()
checkbutton_2 = tkinter.Checkbutton(text='No.2', variable=bool_2)
checkbutton_2.pack()
checkbutton_3 = tkinter.Checkbutton(text='No.3', variable=bool_3)
checkbutton_3.pack()

# チェックボックス入力真偽値判定ボタン
button = tkinter.Button(text='ボタン', width=60)
button.bind('<Button-1>', check_boolean)
button.pack()

window.mainloop()
Tkinter チェックボックスの設置

チェックボックスでチェックの有無を確認したい場合には上で行っているように
チェック判定用に変数を生成し、Checkbutton()で「variable=チェック用変数」とする必要があります

「variable=True」ではダメなの?って思うかもしれませんが、実際に行ってみるとエラーが返されてしまいます

チェックボックスのチェック判定は判定用に生成した変数で行います
variableを使用することで対象のチェックボックスと紐付けされているので問題なく判定に使用できます

ラジオボタン

ラジオボタンは「Radionbutton(text=’ラジオ名’)」を使用します

以下は一つのラジオボタンのみを選択しておきたいときに使えるコードとなります

import tkinter

# ラジオボタン一つのみ選択可能
def change_radio():
    check = var.get()

    if check == 1:
        radio_2.configure(state='normal')
        radio_3.configure(state='normal')

    elif check == 2:
        radio_1.configure(state='normal')
        radio_3.configure(state='normal')

    elif check == 3:
        radio_1.configure(state='normal')
        radio_2.configure(state='normal')


# ウィンドウ
window = tkinter.Tk()
window.title('Sample Tkinter')
window.geometry('480x480')

# チェック判定用変数
var = tkinter.IntVar()

# ラジオボタン初期選択
var.set(1)

# ラジオボタンの生成
radio_1 = tkinter.Radiobutton(text='Radio1', value=1, variable=var, command=change_radio)
radio_1.pack()
radio_2 = tkinter.Radiobutton(text='Radio2', value=2, variable=var, command=change_radio)
radio_2.pack()
radio_3 = tkinter.Radiobutton(text='Radio3', value=3, variable=var, command=change_radio)
radio_3.pack()

window.mainloop()
Tkinter ラジオボタンの設置

radio_1.configure(state='normal')」のようにstateをnomalで指定すると再度の選択が可能になります
ちなみにstateに設定できるのは

nomal:通常の状態
active:アクティブな状態
disabled:無効な状態

の3つです

リストボックス

リストボックスは「Listbox(listvariable='リストボックス項目')」を使用します

以下はリストボックス内の選択した値をテキストに出力するコードです

import tkinter

# 選択リストをテキストへ追加
def selection_insert(event):
    for l in listbox.curselection():
        output_txt.insert(tkinter.END, listbox.get(l) + '\n')


# ウィンドウ
window = tkinter.Tk()
window.title('Sample Tkinter')
window.geometry('480x480')

# リストボックス項目
box_name = ('ラベル', '入力ボックス', 'ボタン', 'チェックボックス', 'ラジオボタン', 'リストボックス')

# リストボックス項目の設定
var = tkinter.StringVar(value=box_name)

# リストボックスの生成
listbox = tkinter.Listbox(listvariable=var)
listbox.bind('<<ListboxSelect>>', selection_insert)
listbox.pack()

# 出力用テキスト
output_txt = tkinter.Text()
output_txt.pack()

window.mainloop()
Tkinter リストボックスの設置

bind('<<ListboxSelect>>', 関数名)」で選択されたときの挙動を操作できます

リストボックスの選択タイプを変更したい場合には「configure(selectmode=’browse’)」などで変更できます

  • browse:単一選択、ドラッグで変更
  • single:単一選択、ドラッグで変更不可
  • multiple:複数選択、クリックでON/OFF変更
  • extended:複数選択、ドラッグで複数選択