こういった思いを持たれている方向けにTkinterの特徴と使い方を解説します。
TkinterはGUIを比較的簡単に作れるライブラリで、プログラミング経験の浅い方でも扱いやすいです。
- Tkinterがどういうものか理解できる
- Tkinterの基本的な使い方が理解できる
- ボタンやラベルを駆使して簡単なGUIが作れるようになる
- 1 Tkinterとは?
- 2 Tkinterの使い方
- 2.1 ウィンドウの作成
- 2.2 Label
- 2.3 Button
- 2.4 画像の配置
- 2.5 Canvas
- 2.6 Checkbutton
- 2.7 Combobox
- 2.8 Entry
- 2.9 Frame
- 2.10 LabelFrame
- 2.11 Listbox
- 2.12 Menu
- 2.13 Notebook
- 2.14 OptionMenu
- 2.15 PanedWindow
- 2.16 Progressbar
- 2.17 Radiobutton
- 2.18 Scale
- 2.19 Scrollbar
- 2.20 Text
- 2.21 ScrolledText
- 2.22 Separator
- 2.23 Sizegrip
- 2.24 Spinbox
- 2.25 Treeview
- 3 ウィジェットの配置方法
- 4 結論:Tkinterは初心者におすすめ
Tkinterとは?
Tkinterとはデスクトップ向けアプリを作成するライブラリのことです。
Tkinterでできること
Tkinterを使うとGUIを作成できます。
具体的には以下のようなアプリの画面を作成することができるようになります。
- 電卓
- タイマーアプリ
- 英単語アプリ
- オセロ
これらは一例に過ぎません。
Tkinterではラベル、ボタン、入力フォーム、ラジオボタンなどを駆使して、オリジナルのGUIを作成することが可能です。
デスクトップアプリを作成しようと思われている方には、超おすすめのライブラリです。
Tkinterは比較的簡単
こういった思いを持たれる方もいるかと思います。
結論を述べると、Tkinterは他のライブラリに比べると簡単です。
プログラミング初心者の方でも比較的容易にマスターすることができます。
その理由は以下の2つです。
制作物がわかりやすい
Tkinterが比較的簡単だと述べた理由の1つに「制作物がわかりやすい」ということがあげられます。
GUIということもあって自分のコードによって出来上がるものが、視覚的にわかりやすく表示されます。
したがって自分のコードのミスを修正しやすいというメリットがあります。
またTkinterは非常に短いコードでウィンドウの作成ができます。
自分の努力が即座に可視化されるというのは、プログラミングのモチベーションになりやすいです。
GUIとコードを突き合わせながら、学習を進めることでプログラミングそのものを楽しむことができます。
楽しい学習は継続しやすく、それ故にTkinterはマスターしやすいライブラリとなっています。
標準ライブラリなのでpipインストール不要
Tkinterが初学者に優しい理由として、Tkinterが標準のライブラリであることが挙げられます。
Pythonの環境さえ入れてしまえば、Tkinterをご自身のPCにインストールする手間は必要ありません。
コマンドプロンプトを立ち上げてpipコマンドを打ち込む必要がないということです。
Tkinterの使い方
それではTkinterの基本的な使い方について解説します。
ウィンドウの作成
まずはウィンドウの作成方法についてです。
TkinterでGUIを作成する時は、.pyファイルの先頭行に必ず以下を打ち込んでください。
import tkinter
上記を入力することでtkinterモジュールをインポートすることができます。
そしてウィンドウの作成は以下のコードで行えます。
# ウィンドウの作成
root = tkinter.Tk()
# ウィンドウのループ処理
root.mainloop()
root.mainloop()はウィンドウの待機処理とウィンドウで行われた操作を受け付けるためのコードで。
この一文を書いていないとウィンドウが即座に閉じられ、プログラムの実行が終わってしまいます。
またmainloop()がないとボタンのクリックなどのウィンドウ上で発生したイベントの処理も正しく行えません。
忘れずにmainloop()を記述するようにしてください。
ウィンドウの作成に関するサンプルコードを以下に記述しました。
import tkinter
# ウィンドウの作成
root = tkinter.Tk()
root.title('Window practice!')
root.iconbitmap('icon.ico')
root.geometry('500x300')
# サブウィンドウの作成
subwindow = tkinter.Toplevel()
subwindow.title('Sub window')
subwindow.config(bg='#123123')
subwindow.geometry('200x300+500+500')
# ウィンドウのループ処理
root.mainloop()
root.title(‘Window practice!’)で、ウィンドウのタイトルを設定しています。
この例では「Window practice!」という文字列がウィンドウのタイトルとして表示されます。
root.iconbitmap(‘icon.ico’)でウィンドウのアイコンを設定しています。
これによって「icon.ico」という画像ファイルがウィンドウのアイコンとして表示されています。
Tkinterのアイコンには「.ico」という拡張子の画像ファイルしか設定できません。
root.geometry(‘500×300’)ではウィンドウのサイズを設定しています。
「幅x高さ」の順番で指定します。
今回の例では横幅500x高さ300のウィンドウが出来上がります。
上記のプログラムではサブウィンドウも起動するようにしています。
subwindow = tkinter.Toplevel()と打ち込むことによってサブウィンドウを作成できます。
subwindow.config(bg=’#123123′)ではサブウィンドウの背景色を設定しています。
色の指定はカラーコードで行っても良いですし、subwindow.config(bg=’red’)のように色の名前を指定することによっても設定できます。
subwindow.geometry(‘200×300+500+500’)ではサブウィンドウの大きさと表示位置を指定しています。
‘200×300’でサブウィンドウのサイズを設定しています。
‘+500+500’でサブウィンドウの表示位置を設定しています。
TkinterではPC画面の左上が(0, 0)という座標になっています。
したがって’+500+500’は画面の左上から右に500、下に500行った場所にサブウィンドウを表示するという設定になっています。
なぜこのように表示位置を設定するかというと、デフォルトでは1つ目のウィンドウとサブウィンドウが重なる形で表示されるからです。
2つのウィンドウが重なって表示されるのが嫌な場合は、’+〇〇+〇〇’で画面表示位置を変更するようにしてください。
Label
続いてTkinter上にラベルを作成する方法について解説します。
ラベルの作成は以下のコードで行えます。
import tkinter
# ウィンドウの作成
root = tkinter.Tk()
root.title('Label practice!')
root.iconbitmap('icon.ico')
root.geometry('550x550')
root.resizable(0, 0)
# ラベルの作成
label_1 = tkinter.Label(root, text='よろしくお願いします')
label_1.pack()
# ウィンドウのループ処理
root.mainloop()
tkinter.Label(root, text=’よろしくお願いします’)では第一引数にそのラベルを表示したい場所を指定します。
この例ではrootというウィンドウの上にラベルを作成するので第一引数にrootを記入しています。
そしてtext=’〇〇’にご自身が画面上に表示したテキストを設定します。
ここでTkinterを扱う上で注意すべき点があります。
ラベルなどのウィジェットを作成するだけでは、画面上に表示されない。
ということです。
label_1.pack()のように記述してそのラベルをウィンドウ上に配置するというコードを書かなければなりません。
Tkinterでウィジェットを作成する時は以下の2つのステップが必要であることを覚えておいてください。
- ウィジェットの作成
- ウィジェットの配置
Button
続いてTkinterでボタンを取り扱う方法について解説します。
ボタンは以下のコードによって作成可能です。
import tkinter
def print_hello_world():
print('hello world!')
# ウィンドウの作成
root = tkinter.Tk()
root.title('Button practice!')
root.iconbitmap('icon.ico')
root.geometry('550x550')
root.resizable(0, 0)
# ボタンの作成
button_1 = tkinter.Button(root, text='ボタン1', command=print_hello_world)
button_1.pack(ipadx=20, ipady=20)
# ウィンドウのループ処理
root.mainloop()
tkinter.Button(root, text=’ボタン1′, command=print_hello_world)ではラベルと同じように第一引数にボタンを作成したい場所を指定しています。
今回の例だとrootというウィンドウ上にボタンを作成するように指定しています。
そしてtext=’〇〇’の部分でボタン上に表示されるテキストを指定しています。
さらにcommand=〇〇の部分でボタンが押された時の処理を記入しています。
この例ではボタンが押されると「print_hello_world」という関数が実行されるようになっています。
button_1.pack(ipadx=20, ipady=20)のipdaxとipadyではウィジェットの内側の空白を指定しています。
内側の空白を指定することでボタンを大きくすることが可能です。
画像の配置
Tkinterの画面上に画像を配置する方法について解説します。
画像の配置は以下のようなコードで行えます。
import tkinter
# ウィンドウの作成
root = tkinter.Tk()
root.title('Image practice!')
root.iconbitmap('icon.ico')
root.geometry('550x550')
root.resizable(0, 0)
# 画像を配置
image_1 = tkinter.PhotoImage(file='dice.png')
label_1 = tkinter.Label(root, image=image_1)
label_1.pack()
button_1 = tkinter.Button(root, image=image_1)
button_1.pack()
# ウィンドウのループ処理
root.mainloop()
tkinter.PhotoImage(file=’dice.png’)で画像ファイルを読み込んでいます。
tkinter.PhotoImage()では.pngという拡張子の画像しか読み込めません。
.jpgは非対応です。
.jpgを使いたい場合は面倒ですがpillowという画像処理ライブラリを使って画像を読み込むなどしなくてはなりません。(この方法については無料動画で解説しています。)
今回の例では読み込んだ画像をラベルとボタンの2つのやり方で表示しています。
tkinter.Label(root, image=image_1)、tkinter.Button(root, image=image_1)の様にどちらもimage=〇〇という部分に読み込んだ画像ファイルを指定すれば画像をウィンドウ上に表示することができるようになります。
Canvas
続いてCanvasについてです。
Canvasは図やグラフなどを設置する際に使うウィジェットになります。
Canvasを使った具体的なコードは以下になります。
import tkinter
# ウィンドウの作成
root = tkinter.Tk()
root.geometry("400x300")
# キャンバスを作成
canvas = tkinter.Canvas(root, height=300, width=300)
# 四角形の作成
canvas.create_rectangle(10, 20, 30, 90, fill='pink')
# 多角形の作成
canvas.create_polygon(200, 10, 200, 100, 150, 100, fill="yellow")
# 直線の作成
canvas.create_line(10, 200, 10, 300, fill='blue')
# 円の作成
canvas.create_oval(100, 180, 200, 280, fill='purple')
# キャンパスを描画
canvas.pack()
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
tkinter.Canvas()の第一引数にボタンを作成する場所、「root」ウィンドウを指定しています。
またheight=”, width=”でCanvasの縦幅と横幅を指定しています。
さらに上記のコードではCanvas上に図形を追加しています。
canvas.create_rectangle()で四角形の作成を行なっています。
引数は(四角形の左上x座標、四角形の左上y座標、幅、高さ)の順で数値を指定しています。
次にcanvas.create_polygon()で多角形を作成しています。
引数は(1つ目の頂点x座標、1つ目の頂点y座標、2つ目の頂点x座標、2つ目の頂点y座標、….)のように指定しています。
3角形を作成したい時は頂点の座標を3つ分用意します。
なおTkinterには三角形を単独で作成する関数は用意されていません。
したがって三角形を作成したい時にはcanvas.create_polygon()を使って3つ分の頂点の座標を指定するようにしましょう。
続いてcanvas.create_line()で直線を作成しています。
引数は(線の一方の端のx座標、線の一方の端のy座標、反対の端のx座標、反対の端のy座標)の順で指定しています。
最後にcanvas.create_oval()で円を作成しています。
引数は(円の左上x座標、円の左上y座標、円の右下のx座標、円の右下のy座標)の順で指定しています。
Checkbuttonはその名の通り、Tkinterの画面上にチェックボタンを作成するためのウィジェットです。
具体的なコードとしては以下になります。
import tkinter
# ウィンドウの作成
root = tkinter.Tk()
root.geometry('300x300')
# 関数の定義
def print_value():
print(boolean_1.get())
# チェックボタンのON/OFF
boolean_1 = tkinter.BooleanVar()
boolean_2 = tkinter.BooleanVar()
# 初期値の設定
boolean_1.set(True)
# チェックボタンの作成
checkbutton_1 = tkinter.Checkbutton(root, text='チェックボタン1', variable=boolean_1)
checkbutton_2 = tkinter.Checkbutton(root, text='チェックボタン2', variable=boolean_2)
checkbutton_1.grid(row=1, column=0, pady=20, padx=30)
checkbutton_2.grid(row=1, column=1, pady=20, padx=30)
# ボタンの作成
button_1 = tkinter.Button(root, text='テスト', command=print_value)
button_1.grid(row=2, column=0, columnspan=2, padx=100, pady=10, ipadx=10)
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
tkinter.Checkbutton()でチェックボタンは作成可能ですが、第一引数にチェックボタンを作成するrootウィンドウを指定しています。
さらにtext=”でチェックボタンに表示する文字列の指定を行なっています。
またvariable=〇〇でボタンがチェックされているかどうかの情報を保持するための変数を指定しています。
今回のコードではあらかじめ、tkinter.BooleanVar()で真偽値を保持するためのインスタンスを作成しています。
チェックボタンがチェックされている時には、boolean_1またはboolean_2に「True」が挿入されるようになっています。
逆にチェックされていない時は「False」が挿入されます。
なおboolean_1またはboolean_2にチェックが入っているかどうかを確認したい時は、boolean_1.get()またはboolean_2.get()とすることでTrueもしくはFalseを確認することができます。
さらにboolean_1.set(True)とすることでチュックボタン1が始めからチェックされている状態にすることができます。
Combobox
Comboboxはプルダウンメニューを作成するためのウィジェットです。
Comboboxを使用したコードは以下になります。
import tkinter as tk
from tkinter import ttk
import tkinter
# ウィンドウの作成
root = tk.Tk()
root.geometry('200x100')
# 関数の定義
def print_value():
print(combobox.get())
# プルダウンの中身を定義
pulldown_list = ('月曜', '火曜', '水曜', '木曜', '金曜', '土曜', '日曜')
# プルダウンの作成
combobox = ttk.Combobox(root, values=pulldown_list)
combobox.pack(pady=10)
# 初期値の設定
combobox.set('月曜')
# ボタンの作成
button_1 = tkinter.Button(root, text='ボタン', command=print_value)
button_1.pack(pady=10)
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
Comboboxを使用する時には「from tkinter import ttk」としてttkモジュールが使えるようにしてください。
そしてttk.Combobox()の第一引数にボタンを作成する場所、「root」ウィンドウを指定しています。
プルダウンに表示したい情報はあらかじめタプルで定義して、values=〇〇という変数に渡しています。
なおプルダウンの初期値を設定したい場合はcombobox.set(”)で行うことができます。
Entry
Entryは入力フォームを作成するためのウィジェットです。
Entryを使ったプログラムは以下になります。
import tkinter
# ウィンドウの作成
root = tkinter.Tk()
root.geometry('300x300')
# 関数の定義
def print_value():
print(entry_1.get())
# entryの作成
entry_1 = tkinter.Entry(root)
entry_1.insert(0, '初期値です')
entry_1.pack(pady=30)
# ボタンの作成
button_1 = tkinter.Button(root, text='テスト', command=print_value)
button_1.pack()
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
tkinter.Entry()の第一引数にrootウィンドウを指定しています。
さらにentry_1.insert()で入力フォームに表示される初期値を指定しています。
今回の場合、entry_1.insert(0, ‘初期値です’)とすることでEntryの0文字目、つまり最初の空白から「初期値です」という文字列を挿入するように指定しています。
Frame
Frameは画面デザインを整えるために使用するウィジェットになります。
複数のウィジェットを使用していると、画面構造が複雑になりTkinterの画面デザインを整えるのが難しくなります。
そこで一定のまとまりごとにFrameを作成してデザインを整えやすくします。
例えばframeを分ける事で一次元的にウィジェットを配置するpack()と二次元的にウィジェットを配置するgridを同じ画面上で使い分けることができます。
(逆にframeを使用しなければ、packとgridを混在させることはできません)
import tkinter
# ウィンドウの作成
root = tkinter.Tk()
root.geometry('550x550')
# frameの作成
frame_1 = tkinter.Frame(root, bg='yellow')
frame_2 = tkinter.Frame(root, bg='green')
# frameをroot上に配置
frame_1.pack(fill='both', expand=True)
frame_2.pack(fill='both', expand=True)
# ウィジェットの配置
tkinter.Label(frame_1, text='テスト').pack()
tkinter.Label(frame_1, text='テスト').pack()
tkinter.Label(frame_1, text='テスト').pack()
tkinter.Label(frame_2, text='テスト').grid(row=0, column=0)
tkinter.Label(frame_2, text='テスト').grid(row=1, column=1)
tkinter.Label(frame_2, text='テスト').grid(row=2, column=2)
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
tkinter.Frame()の第一引数にrootウィンドウを指定しています。
またframeの背景色をbg=”で指定しています。
さらにframe_1.pack()もしくはframe_2.pack()しただけではframeが小さすぎて作成されていないように見えてしまうので、「fill=’both’, expand=True」でframeを画面一杯に引き伸ばしています。
fill=”はframeを引き伸ばす方向を指定しています。
今回の場合は‘both’としているため縦横、両方向に引き伸ばされています。
どちらかだけにしたい場合は、横方向だけなら’x’、縦方向だけなら’y’と指定します。
またexpand=Trueとしてframeが引き伸ばされるのを許可しています。
LabelFrame
LabelFrameはFrameの一種ですが、Frameとは少しデザインが異なり、枠線がより強調されています。
LabelFrameを使用したプログラムは以下になります。
import tkinter
# ウィンドウの作成
root = tkinter.Tk()
root.title('Frame practice!')
root.geometry('300x200')
# frameの作成
frame_3 = tkinter.LabelFrame(root, text='ラベルフレームです', borderwidth=5)
# frameをroot上に配置
frame_3.pack(fill='both', expand=True, padx=5, pady=5)
# ウィジェットの配置
tkinter.Label(frame_3, text='テストです').grid(row=0, column=0)
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
tkinter.LabelFrame()でラベルフレームを作成しています。
なおborderwidth=〇〇とすることでフレームの枠線の太さを設定しています。
Listbox
Listboxはリスト形式で情報を表示するためのウィジェットです。
Listboxを使用したプログラムは以下になります。
import tkinter
# ウィンドウの作成
root = tkinter.Tk()
root.geometry('220x200')
root.title('Listbox')
# フレームの作成
frame = tkinter.Frame(root)
frame.pack(padx=10, pady=20)
# リストボックスの中身の定義
content_list = ('さんまの塩焼き', '揚げ出し豆腐', '酢豚', 'お寿司', '焼き肉', 'タピオカ', 'チーズハットグ')
var = tkinter.StringVar(value=content_list)
# リストボックスの作成
listbox = tkinter.Listbox(frame, listvariable=var, height=6)
listbox.pack(side='left')
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
cotent_list=()であらかじめリストボックスに表示したい文字列をタプルで定義しています。
そしてそのタプルをtkinter.StringVar()で作成したインスタンスに渡しています。
タプルを渡したインスタンスをlistbariable=〇〇の部分で引数として渡すと、リストボックスの中身を指定することができます。
なおlistbox.pack(side=’left’)とすることで、リストボックスの文字列を左寄せで表示するように設定しています。
Menu
MenuはTkinterの画面にメニューバーを作成するためのウィジェットです。
Menuを使用したプログラムは以下になります。
import tkinter
# ウィンドウの作成
root = tkinter.Tk()
# 関数の作成
def setting():
pass
def save():
pass
# メニューバーの作成
menu_bar = tkinter.Menu(root)
# メニューバーに「ファイル」を作成
menu_file = tkinter.Menu(menubar, tearoff=0)
menu_bar.add_cascade(label='ファイル', menu=menu_file)
# 親メニュー「ファイル」に子メニュー「環境設定」「保存」を作成
menu_file.add_command(label='環境設定', command=setting)
menu_file.add_command(label='保存', command=save)
# メニューバーを画面にセット
root.config(menu=menu_bar)
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
tkinter.Menu(root)でrootウィンドウにメニューバーを作成しています。
そしてtkinter.Menu(menubar, tearoff=0)でmenubar内に子となるメニューを作成しています。
menu_bar.add_cascade(label=’ファイル’, menu=menu_file)にてファイルというメニューボタンを作成しています。
さらにmenu_file.add_command(label=’環境設定’, command=setting)で「ファイル」という親メニューに子メニューである「環境設定」を作成しています。
なおcommand=〇〇の部分でメニューがクリックされた時に実行される関数を指定しています。
Notebook
Notebookは複数のタブを作成するためのウィジェットです。
Notebookを使用したプログラムは以下になります。
import tkinter
import tkinter.ttk as ttk
# ウィンドウの作成
root = tkinter.Tk()
root.geometry("300x300")
# Notebookウィジェットの作成
notebook = ttk.Notebook(root)
# タブの作成
tab_1 = tkinter.Frame(notebook)
tab_2 = tkinter.Frame(notebook)
# notebookにタブを追加
notebook.add(tab_1, text="タブ1")
notebook.add(tab_2, text="タブ2")
# tab_oneに配置するウィジェットの作成
label = tkinter.Label(tab_1, text="ラベルの設置")
# ウィジェットの配置
notebook.pack(expand=True, fill='both', padx=10, pady=10)
label.pack()
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
ttk.Notebook(root)でrootウィンドウにNotebookウィジェットを作成しています。
そしてnotebook.add()でタブの追加を行なっています。
今回の場合、第一引数にあらかじめ作成しておいたframeウィジェットを指定しています。
OptionMenu
OptionMenuはプルダウンメニューを作成するためのウィジェットです。
プルダウンメニューはComboboxでも作成できますが、デザインが異なります。
OptionMenuを使用したプログラムは以下になります。
import tkinter
# オプションメニューの中身の定義
content_list = ['月曜', '火曜', '水曜', '木曜', '金曜', '土曜', '日曜']
# ウィンドウの作成
root = tkinter.Tk()
root.geometry('300x300')
# 変数の設定
day_of_week = tkinter.StringVar(root)
day_of_week.set(content_list[0])
# オプションメニューの作成
option_menu = tkinter.OptionMenu(root, day_of_week, *content_list)
option_menu.pack(pady=30)
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
tkinter.OptionMenu(root, day_of_week, *content_list)でOptionMenuを作成しています。
day_of_week = tkinter.StringVar(root)で定義した変数をtkinter.OptionMenuの引数に渡しています。
そしてOptionMenuの中身としてあらかじめ用意しておいたcontent_listを渡しています。
PanedWindow
PanedWindowはウィジェットのサイズを逐次、変更可能にするためのウィジェットです。
PanedWindowを使用したプログラムは以下になります。
import tkinter
# ウィンドウの作成
root = tkinter.Tk()
root.geometry('300x300')
# PanedWindowの作成
paned_window = tkinter.PanedWindow(root)
# フレームの作成
frame_1 = tkinter.LabelFrame(paned_window, text='frame1')
frame_2 = tkinter.LabelFrame(paned_window, text='frame2')
# ラベルの作成
label_1 = tkinter.Label(frame_1, text='ラベルです')
label_1.pack()
# フレームをPanedWindowに追加
paned_window.add(frame_1)
paned_window.add(frame_2)
paned_window.pack(expand=True, fill='both')
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
PanedWindowを使用しているのでLabelFrameのサイズを以下のように変更することが可能です。
tkinter.PanedWindow(root)でPanedWindowを定義しています。
そしてPanedWindowにframe_1とframe_2を登録することで、フレームのサイズをカーソルを使って変更可能にしています。
Progressbar
Progressbarはその名の通り、プログレスバーを作成するためのウィジェットです。
Progressbarを使用したプログラムは以下の通りです。
import tkinter
from tkinter import ttk
# ボタンクリック時に実行する関数
def count_up():
if bar_value.get() < 100:
bar_value.set(bar_value.get() + 5)
# ウィンドウの作成
root = tkinter.Tk()
root.geometry('200x200')
# プログラスバー用の変数を作成
bar_value = tkinter.IntVar(root)
# プログレスバーの作成
progress_bar = ttk.Progressbar(root, maximum=100, mode="determinate", variable=bar_value)
progress_bar.pack(pady=30)
# ボタンの作成
button_1 = tkinter.Button(root, text="カウント", command=count_up)
button_1.pack()
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
ttk.Progressbar(root, maximum=100, mode=”determinate”, variable=bar_value)でProgressbarを作成しています。
Progressbarがフルで満たされた状態をmaximum=〇〇で設定しています。
今回の場合は、変数の値が100の時にプログレスバーが緑で満たされるようになっています。
なお変数の値はtkinter.IntVar(root)で定義しています。
※mode='indeterminate'とするとプログレスバーが部分的に緑になります。
Radiobuttonでは複数のボタンの中から一つのボタンのみを選択できるウィジェットを作成できます。
Radiobuttonを使用したプログラムは以下になります。
import tkinter
from tkinter import IntVar
# 関数の定義
def print_number():
if number.get() == 1:
label_number = tkinter.Label(frame_2, text='1が選択されました')
elif number.get() == 2:
label_number = tkinter.Label(frame_2, text='2が選択されました')
label_number.pack()
# ウィンドウの作成
root = tkinter.Tk()
root.geometry('550x550')
# フレームの作成
frame_1 = tkinter.Frame(root)
frame_2 = tkinter.Frame(root)
frame_1.pack(padx=10, pady=10)
frame_2.pack(padx=10, pady=(0, 10))
# 整数の保持用にインスタンスを作成
number = IntVar()
number.set(1)
# ラジオボタンの作成
radio_1 = tkinter.Radiobutton(frame_1, text='1を出力します', variable=number, value=1)
radio_2 = tkinter.Radiobutton(frame_1, text='2を出力します', variable=number, value=2)
radio_1.grid(row=0, column=0, padx=10, pady=10)
radio_2.grid(row=0, column=1, padx=10, pady=10)
button_1 = tkinter.Button(frame_1, text='出力', command=print_number)
button_1.grid(row=1, column=0, columnspan=2, padx=10, pady=10)
# ループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
tkinter.Radiobutton(frame_1, text=’1を出力します’, variable=number, value=1)でラジオボタンを作成しています。
variable=〇〇でボタンに変数を割り当てています。
そしてvalue=〇〇でそのボタンが選択された時に、変数に挿入される数字を定義しています。
今回の場合、radio_1が選択された場合はnumberという変数に1という数字が挿入されます。
逆にradio_2が選択された場合はnumberという変数に2という数字が挿入されます。
なお今回はnumber.set(1)で初期状態でradio_1が選択されているように設定しています。
Scale
Scaleはスケールバーを作成するためのウィジェットです。
Scaleを使用したプログラムは以下になります。
import tkinter
import tkinter.filedialog
from tkinter import END, ANCHOR
import pygame.mixer as pymix
# ウィンドウの作成
root = tkinter.Tk()
root.geometry('500x200')
# 関数の定義
def print_value(value):
print(value)
# スケールバーの作成
scale_label = tkinter.Label(root, text='スケールバー')
scale_bar = tkinter.Scale(root, orient='horizontal', length=300, from_=0.0, to=1.0, resolution=0.01, showvalue=0, command=print_value)
scale_bar.set(0.1)
scale_label.pack(padx=10, pady=10)
scale_bar.pack(padx=10, pady=10)
# ループ処理の実行
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
tkinter.Scale(root, orient=’horizontal’, length=300, from_=0.0, to=1.0, resolution=0.01, showvalue=0, command=print_value)でScaleを作成しています。
まずorient=〇〇でScaleの方向を指定しています。
‘horizontal’にすると横方向、’vertical’にすると縦方向にScaleが作成されます。
今回の場合、「from_=0.0, to=1.0, resolution=0.01」でスケールバーの左端を0.0、右端を1.0として、スケールバーは0.01刻みで調整可能に設定してあります。
またスケールバーが移動されるごとに、command=〇〇で指定した関数が実行されます。
なお関数にはスケールバーの位置に応じた数値が引数として自動的に渡されます。
そのためスケールバーのcommandに使用する関数を定義する際には、引数を定義することを忘れないようにしましょう。
Scrollbar
Scrollbarはその名の通り、スクロールバーを作成するためのウィジェットです。
Scrollbarを使用したプログラムは以下になります。
import tkinter
from tkinter import ttk
# ウィンドウの作成
root = tkinter.Tk()
root.geometry('220x200')
# フレームの作成
frame = tkinter.Frame(root)
frame.pack(padx=10, pady=20)
# リストボックスの中身の定義
content_list = ('さんまの塩焼き', '揚げ出し豆腐', '酢豚', 'お寿司', '焼き肉', 'タピオカ', 'チーズハットグ')
var = tkinter.StringVar(value=content_list)
# リストボックスの作成
listbox = tkinter.Listbox(frame, listvariable=var, height=6)
listbox.pack(side='left')
# スクロールバーの定義
scrollbar = ttk.Scrollbar(frame, orient='vertical', command=listbox.yview)
listbox['yscrollcommand'] = scrollbar.set
scrollbar.pack(side='right', fill='both')
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
ttk.Scrollbar(frame, orient=’vertical’, command=listbox.yview)でScrollbarを作成しています。
なおcommand=〇〇.yviewとすることで縦方向にスクロールバーを設定しています。
もし横方向に設置したい場合には、〇〇.xviewと指定します。
そしてスクロールバーを設置するウィジェットについてlistbox[‘yscrollcommand’] = scrollbar.setと指定しています。
command=〇〇.yviewと〇〇[‘yscrollcommand=scrollbar.setを行う事でスクロールバーを所望のウィジェットに配置しています。
スクロールバーを使用するには、両方の宣言が必要ですので忘れないようにしてください。
Text
Textは複数行入力可能な入力フォームを作成するためのウィジェットです。
Textを使用したプログラムは以下になります。
import tkinter
# ウィンドウの作成
root = tkinter.Tk()
root.geometry('300x300')
# テキストウィジェットの作成
text_widget = tkinter.Text(root, width=38, height=20)
text_widget.grid(column=0, row=0, padx=15, pady=10)
# 初期値の挿入
text_widget.insert('1.0', '今日は晴れです。\n明日は雨です。')
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
tkinter.Text(root, width=38, height=20)でTextを作成しています。
なおtext_widget.insert(‘1.0’, ‘今日は晴れです。\n明日は雨です。’)でTextウィジェットに初期値を設定しています。
第一引数で初期値を挿入する場所を指定しています。
今回の場合、‘1.0’と指定しており、1行目の0文字目から文字列を挿入することになります。
つまり左上から文字を挿入するということです。
そして第二引数に初期値として入力したい文字列を設定しています。
ScrolledText
ScrolledTextはスクロール可能なTextウィジェットを作成するために使われます。
import tkinter
from tkinter import scrolledtext
# ウィンドウの作成
root = tkinter.Tk()
root.geometry('300x150')
# スクロールバー付きのテキストウィジェットの作成
text_area = scrolledtext.ScrolledText(root, width=40, height=10)
text_area.pack(pady=10, padx=10)
# 初期値の設定
text_area.insert('1.0', 'テスト用の文章です。\n\n\n\n\n\n\n\n\n\n\n\n文章はこれで終わりです。')
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
scrolledtext.ScrolledText(root, width=40, height=10)でScrolledTextウィジェットを作成しています。
引数の指定方法などはTextウィジェットと同じです。
Separator
Separatorは境界線を作成するためのウィジェットです。
Separatorを使用したプログラムは以下になります。
import tkinter as tk
import tkinter.ttk as ttk
# ウィンドウの作成
root = tk.Tk()
root.geometry("200x200")
# デザインの設定
style = ttk.Style()
style.configure("red.TSeparator", background="red")
style.configure("yellow.TSeparator", background="yellow")
style.configure("purple.TSeparator", background="purple")
# 境界線の作成
separator_red = ttk.Separator(root, style="red.TSeparator", orient='horizontal')
separator_red.pack(padx=10, pady=10, fill='x')
separator_yellow = ttk.Separator(root, style="yellow.TSeparator", orient='vertical')
separator_yellow.pack(fill='y', expand=True)
separator_purple = ttk.Separator(root, style="purple.TSeparator", orient='horizontal')
separator_purple.pack(padx=10, pady=10, fill='x')
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
ttk.Separator(root, style=”red.TSeparator”, orient=’horizontal’)で境界線を作成しています。
style=〇〇の部分で境界線の色を指定しています。
またorient=〇〇で境界線の方向を指定しています。
‘horizontal’の場合は横方向、’vertical’の場合は縦方向に境界線が作成されます。
Sizegrip
Sizegripはウィンドウがサイズ変更可能なことを示すためのウィジェットです。
Sizegripを使用したプログラムは以下になります。
from tkinter import ttk
import tkinter
# ウィンドウの作成
root = tkinter.Tk()
root.minsize(100, 100)
root.maxsize(400, 400)
# デザインの設定
style = ttk.Style()
style.configure("gray.TSizegrip", background="gray")
# サイズグリップの作成
sizegrip = ttk.Sizegrip(root, style="gray.TSizegrip")
sizegrip.pack(side='bottom', anchor='se')
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
ttk.Sizegrip(root, style=”gray.TSizegrip”)でSizegripウィジェットを作成しています。
style=〇〇の部分でSizegripウィジェットのデザインを指定しています。
なおstyle=〇〇の部分で指定するデザインはあらかじめ、style.configure(“gray.TSizegrip”, background=”gray”)として指定してあげています。
Spinbox
SpinboxはEntryウィジェットの右側に上下を示すボタンが付いているウィジェットです。
値を直接打ち込むことも出来ますし、右側の上下ボタンをクリックすることで値を指定することも可能です。
Spinboxを使ったプログラムは以下になります。
import tkinter
from tkinter import ttk
# ウィンドウの設定
root = tkinter.Tk()
root.geometry('300x200')
# スピンボックス用の値を定義
value_taple = ('月曜', '火曜', '水曜', '木曜', '金曜')
# スピンボックスの作成
spinbox_1 = ttk.Spinbox(root, from_=1, to=10, increment=0.5, width=10)
spinbox_2 = ttk.Spinbox(root, value=value_taple, width=10, state='readonly')
spinbox_1.pack(pady=30)
spinbox_2.pack(pady=30)
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
ttk.Spinbox(root, from_=1, to=10, increment=0.5, width=10)でSpinboxを作成しています。
今回の場合、「from_=1, to=10, increment=0.5」で1〜10までの値を0.5刻みで選択できるように設定しています。
またSpinboxには値としてあらかじめ用意しておいたタプルを指定することもできます。
value=〇〇の部分に自分がSpinboxに割り当てたい文字列のタプルを渡します。
なお上下ボタンによる値変更をランダムにしたい場合は、state=’readonly’と指定することでその設定が可能です。
Treeview
Treeviewは表を作成するためのウィジェットです。
Treeviewを使用したプログラムは以下になります。
import tkinter
from tkinter import ttk
# ウィンドウの作成
root = tkinter.Tk()
root.geometry('350x200')
# Treeviewを宣言
my_tree = ttk.Treeview(root)
# カラムを作成
my_tree['columns'] = ('日付', '内訳', '金額')
# カラムフォーマットの設定
my_tree.column('#0', width=0, stretch='no')
my_tree.column('日付', anchor='w', width=80)
my_tree.column('内訳', anchor='center', width=80)
my_tree.column('金額', anchor='e', width=80)
# 見出しの設定
my_tree.heading('#0', text='Label', anchor='w')
my_tree.heading('日付', text='日付', anchor='center')
my_tree.heading('内訳', text='内訳', anchor='center')
my_tree.heading('金額', text='金額', anchor='center')
# データの追加
my_tree.insert(parent='', index='end', values=('2021/07/03', '食費', '1200'))
my_tree.insert(parent='', index='end', values=('2021/07/03', '光熱費', '3200'))
my_tree.insert(parent='', index='end', values=('2021/07/03', '食費', '1400'))
my_tree.pack(pady=20)
# ウィンドウのループ処理
root.mainloop()
以上のコードを実行すると以下のような画面が表示されます。
ttk.Treeview(root)でrootウィンドウにTreeviewを作成しています。
そしてmy_tree[‘columns’] = (‘日付’, ‘内訳’, ‘金額’)で表のカラムを作成しています。
またmy_tree.column()のanchor=”でカラムの文字列を左寄せ(’w’)、中央寄せ(’center’)、右寄せ(’e’)にしています。
my_tree.column(‘#0′, width=0, stretch=’no’)の部分で’#0’が出てきています。
Treeviewを作成すると自動的に「階層用カラム」が作成されます。(データ同士の親子関係を示すためのカラム)
‘#0’は階層用カラムのことです。
階層用カラムを非表示にしたい場合は今回のように’#0’をwidth=0にしてください。
最後にデータの追加はmy_tree.insert(parent=”, index=’end’, values=(‘2021/07/03’, ‘食費’, ‘1200’))のように行います。
第一引数であるparent=”は先ほど述べた階層用カラムでデータの親子関係を示したい場合に使用します。
親子関係を無視する場合には、空文字列にしてください。
そしてindex=’end’でTreeviewの末尾にデータを挿入するように指定することが可能です。
追加するデータ自体はvalues=()でタプルで指定してください。
ウィジェットの配置方法
ここでウィジェットの配置方法についてもう少し詳しくご説明します。
ここまでの解説では全てのウィジェットをpack()を用いて画面上に配置していました。
ただTkinterでウィジェットを画面上に配置する方法はpack()の他に後2つあります。
具体的にはgrid()とplace()です。
これらはウィジェットをどのように配置したいかによって使い分けます。
それぞれの特徴について以下で解説していきます。
pack()による配置
pack()は最も簡単なウィジェットの配置方法になります。
配置位置に特にこだわりがない場合には、とりあえずpack()を用いて配置しておけばOKです。
pack()で配置されたウィジェットは、pack()した順に上から整列されて表示されます。
grid()による配置
続いてgrid()による配置についてです。
gridはウィジェットの位置を二次元的に指定したい時に使われます。
gridを使うとウィンドウやフレームが格子状に分断されます。
それに伴ってrow番号とcolumn番号を指定することで、ウィジェットを配置したいマス目を指定することができるようになります。
なおcolumnspanやrowspanを使うと複数の列や行を連結して1つの列、行として扱えるようになります。
grid()を使うことでよりウィジェットをより自由に配置できるようになります。
place()による配置
place()による配置は、ウィンドウやフレーム上の位置をx, y座標で指定してウィジェットを配置する方法になります。
より細かな配置が可能ですが、その分、構造が複雑になりがちです。
pack()やgrid()に比べてプログラムの作成に時間がかかります。
基本はpack()やgrid()で対応して、納得のいかない部分のみplace()を使うようにするのが良いです。
結論:Tkinterは初心者におすすめ
Tkinterの特徴と基本的な使い方について解説しました。
Tkinterは直感的にわかりやすく、学習コストが比較的低いのでGUIを作成してみたい方はぜひ挑戦してみてください!
なお冒頭でもご紹介しましたが、この記事では書ききれなかったTkinterの使い方について無料動画で解説しています。
Tkinterの操作方法についてより詳しく理解したい方は、ぜひ無料動画をご覧ください!