Pythonで手軽にGUI(グラフィカル・ユーザー・インターフェース)アプリを作りたいと思ったことはありませんか?Pythonには標準でTkinterというライブラリが用意されており、これを使えば初心者でも直感的にウィンドウやボタンを持つデスクトップアプリを開発できます。
シンプルにボタンを配置して、ボタンを押したら関数を実行する。
Tkinterの基本:ウィンドウの表示
まずは、すべての部品(ウィジェット)を配置するための土台となる、メインウィンドウを作成し表示させます。
import tkinter
# 1. メインを作成
root = tkinter.Tk()
# 2. ウィンドウのサイズとタイトルを設定
root.geometry('700x600')
root.title('Tkinter 基本のウィンドウ')
# 3. ウィンドウの表示を持続させる
root.mainloop()tkinter.Tk()で、GUIの土台となるメインウィンドウのオブジェクトを作成します。geometry()でウィンドウのサイズを、title()でタイトルバーに表示されるテキストを設定できます。mainloop()で、ウィンドウを表示し続けます。これがないと、プログラムが一瞬で終了してしまいウィンドウが表示されません。
基本のボタン作成とイベント処理
次に、ウィンドウ上にボタンを配置します。クリックされたらコンソールにメッセージを出力させてみます。
import tkinter
# 画面作成
root = tkinter.Tk()
root.geometry('700x600')
root.title('ボタンイベントの検証')
# ボタンがクリックされたときに実行される関数
def show_message():
print("ボタンがクリックされました!")
# ボタンを作成し、commandに関数を指定
test_button = tkinter.Button(root, text="クリックしてね", command=show_message)
# grid()でボタンをウィンドウに配置 (0行目, 0列目)
test_button.grid(row=0, column=0)
# 画面を表示
root.mainloop()tkinter.Buttonでボタンオブジェクトを作成します。
- 第1引数
root:どのウィンドウに配置するかを指定します。 textオプション:ボタンに表示されるテキストです。commandオプション:ボタンがクリックされたときに実行する関数名を指定します。()を付けて関数を呼び出さないように注意してください。
grid()はウィジェットを格子状に配置する命令で、rowとcolumnで位置を指定します。
引数を持つ関数をボタンに渡す方法
関数に引数を渡したい場合、少し工夫が必要です。commandにmy_function(1)のように直接書くと、意図通りに動作しません。これは、プログラムが読み込まれた時点ですぐに関数が実行されてしまうためです。
このような場合は、functoolsモジュールのpartialを使います。
from functools import partial
import tkinter
# # 画面作成
root = tkinter.Tk()
root.geometry('700x600')
root.title('引数をボタンに渡す')
# 引数を受け取る関数
def print_number(num):
print(f"渡された数値は {num} です。")
# 正しい例:partialを使って引数を渡す
# partial(関数名, 引数1, 引数2, ...)
num_btn_1 = tkinter.Button(root, text='数値「1」を出力', command=partial(print_number, 1))
num_btn_1.grid(row=0, column=0)
# 間違った例:これではアプリ起動時に一度だけ実行される
# num_btn_2 = tkinter.Button(root, text='うまく動かない', command=print_number(5))
# num_btn_2.grid(row=1, column=0)
# 画面を表示
root.mainloop()partialは、関数とその引数をセットにして、新しい関数オブジェクトを作成する機能を持っています。これにより、ボタンがクリックされるまで関数の実行を遅延させることができます。
bindメソッドでより柔軟なイベント処理を実装する
commandオプションはクリックイベントにしか対応できませんが、bindメソッドを使えば、マウスの左クリック、右クリック、ボタンからマウスカーソルが離れた瞬間など、より多彩なイベントを処理できます。
<Button-1>でマウスの左ボタンを押したときにイベントが発生します。
# (ウィンドウ作成、表示は省略)
# イベント情報を引数として受け取る関数
def show_widget_text(event):
# event.widgetでイベントが発生したウィジェット自身にアクセスできる
print(f'クリックされたボタンのテキスト: {event.widget["text"]}')
# bindメソッドでイベントと関数を結びつける
text_btn = tkinter.Button(root, text="bindボタン")
# "<Button-1>"はマウスの左クリックを意味する
text_btn.bind("<Button-1>", show_widget_text)
text_btn.grid(row=2, column=0)bindメソッドを使う場合、実行される関数は**eventオブジェクト**を引数として受け取る必要があります。このeventオブジェクトには、イベントが発生したウィジェットの情報などが含まれており、event.widgetのようにしてアクセスできます。
bindでも、引数を使うことはできます。この場合もpartialを使います。
その場合は、eventオブジェクト(押されたボタンの情報など)は最後の引数に入ることになります。
下の例では、関数には4つの引数で、bindのなかでは3つの引数を指定しています。
# (ウィンドウ作成部分は省略)
# 複数の引数とeventを受け取る関数
def bind_with_args(arg1, arg2, arg3, event):
print(f"引数1: {arg1}, 引数2: {arg2}, 引数3: {arg3}")
print(f"イベントが発生したウィジェット: {event.widget['text']}")
# partialで最初の3つの引数を指定する
bind_arg_btn = tkinter.Button(root, text="bind_arg")
# "<ButtonRelease-1>"は左クリックのボタンを離した瞬間のイベント
bind_arg_btn.bind("<ButtonRelease-1>", partial(bind_with_args, "A", "B", "C"))
bind_arg_btn.grid(row=4, column=0)<ButtonRelease-1>を指定することで、左クリックのボタンを離した時点で発火させることもできます。
まとめと次のステップ
今回は、Tkinterの基本として、ウィンドウの作成からボタンの配置、そしてcommandとbindを使ったイベント処理の方法を解説しました。
- ウィンドウ作成:
tkinter.Tk()とmainloop()が基本。 - ボタン作成:
tkinter.Buttonを使い、commandで関数を指定。 - 引数を渡す:
functools.partialを活用する。 - 高度なイベント:
bindメソッドでクリック以外のイベントも扱える。
GUIアプリ開発は、ここからさらにテキスト入力欄(Entry)やラベル(Label)などを追加していくことで、よりインタラクティブなものになります。ぜひ、この記事を足がかりに、あなただけのオリジナルアプリ開発に挑戦してみてください。
参考にしたリンク
・python GUI tcl/tk ウィンドウ全体リサイズ時にフォームサイズも伸縮させる


コメント