このページは Tkinter を使ってメインウィンドウを作成・操作する方法について解説したいと思います。
Contents
メインウィンドウの作成
メインウィンドウは下記を実行することで生成することができます。
- Tkinter の
Tk
クラスのインスタンスを生成する
メインウィンドウを生成するスクリプト例は下記のようになります。
import tkinter
app = tkinter.Tk()
app.mainloop()
実行すると下の図のようなメインウィンドウが表示されることが確認できると思います(見た目は OS 等により異なります)。
Tkinter のインポート
下記では Tkinter モジュールを利用するために tkinter
のインポートを行っています。Python3 では全て小文字で「tkinter
」と記述することに注意しましょう。
import tkinter
スポンサーリンク
メインウィンドウの作成(Tk()
)
メインウィンドウを実際に作成しているのは下記になります。tkinter.Tk
クラスのインスタンスを生成しており、これによりメインウィンドウが作成されます。
app = tkinter.Tk()
tkinter では、まずメインウィンドウを作成し、このメインウィンドウ内にウィジェットを作成・配置していくことで GUI アプリを開発を行していくのが基本的な流れになります。
メインループ(mainloop
)
ではスクリプトの最後の mainloop
では何を行っているでしょうか?この mainloop
は tkinter での GUI アプリ開発において非常に重要なメソッドになります。
app.mainloop()
ここで実行している mainloop
は簡単にいうと下記の2つを行っています。
- アプリの待機
- イベント処理
この mainloop
については下記で詳しく解説していますので、是非こちらも併せて読んでみてください。
が、tkinter 初心者の方にとっては内容が難しいかもしれません…。
まずは「とにかく mainloop
は実行する必要がある」ことを覚えておけば良いと思います。
mainloop
を実行しないとアプリが起動すらしないので注意しましょう!
mainloop
はメインウィンドウだけでなく、どのウィジェットからも実行できるメソッドになります
ですが、mainloop
はメインウィンドウが実行するのが一般的です
まずはメインウィンドウのインスタンスから mainloop
を実行する癖をつけておきましょう!
メインウィンドウへの操作
次はメインウィンドウに対する操作(Tk
クラスのメソッド)にどのようなものがあるかを説明していきたいと思います。
まず Tk
クラスの全メソッドは下記により表示することができます。
import tkinter
help(tkinter.Tk)
ここではこの中から、特にメインウィンドウに対する操作として私がよく使うメソッドを紹介します。
スポンサーリンク
mainloop
mainloop
メソッドはメインウインドウの作成方法で解説したように、メインループによりアプリを待機させるメソッドです。
このメインループの中で受け付けたイベントの処理を実行したり、ウィジェット等の画面への表示が行われます。この mainloop
メソッドは必ず実行するようにしましょう。
geometry
geometry
はメインウィンドウ表示時の「サイズと位置」を指定するメソッドになります。
geometry(self, newGeometry=None)
引数には下記の形式の文字列を指定します。
geometry("WIDTHxHEIGHT+X+Y")
これにより “WIDTH x HEIGHT” サイズのメインウィンドウが、ディスプレイの “(X, Y)” 座標に表示されます。
太文字&赤背景で示した箇所には、実際には設定値を半角数字で指定します(単位はピクセル)。
例えば “600 x 300” サイズのメインウィンドウをディスプレイの “(400, 100)” 座標に表示するためには下記のように geometry
メソッドを実行します。
import tkinter
app = tkinter.Tk()
app.geometry("600x300+400+100")
app.mainloop()
実行すれば、下の図のように指定したサイズのメインウィンドウが指定した座標に表示されます(おそらくサイズや位置はタイトルバーを考慮せずに設定されます)。
また、「位置」を省略し「サイズ」のみを指定する形式でも OK です。
geometry("WIDTHxHEIGHT")
title
title
はメインウィンドウのタイトルを指定するメソッドになります。
title(self, string=None)
title
メソッドにはタイトルとして表示したい文字列を指定します。
import tkinter
app = tkinter.Tk()
app.title("私が開発中のアプリ")
app.mainloop()
実行すればタイトルバーに指定した文字列が表示されるようになります。
スポンサーリンク
minsize
minsize
はメインウィンドウの「最小サイズ」を設定するメソッドになります。
minsize(self, width=None, height=None)
ユーザーがメインウィンドウを小さくしすぎた際に、アプリのレイアウトが崩れることを防ぐのに有効です。
第1引数に設定したいウィンドウの最小の幅、第2引数に設定したいウィンドウの最小の高さを指定します。
import tkinter
app = tkinter.Tk()
app.minsize(500, 100)
app.mainloop()
上記スクリプトを実行し、ウィンドウのサイズを変更してみると、指定したサイズよりも小さくできないことが確認できると思います。
maxsize
maxsize
はメインウィンドウの「最大サイズ」を設定するメソッドになります。
maxsize(self, width=None, height=None)
第1引数に設定したいウィンドウの最大の幅、第2引数に設定したいウィンドウの最大の高さを指定します。
import tkinter
app = tkinter.Tk()
app.maxsize(500, 100)
app.mainloop()
上記スクリプトを実行し、ウィンドウのサイズを変更してみると、指定したサイズよりも大きくできないことが確認できると思います。
resizable
resizable
はメインウィンドウの「サイズ変更の有効 / 無効」を設定するメソッドになります。
resizable(self, width=None, height=None)
第1引数はウィンドウの幅のサイズ変更の有効(True
) / 無効(False
)、第2引数はウィンドウの高さのサイズ変更の有効(True
) / 無効(False
)を指定します。
import tkinter
app = tkinter.Tk()
app.resizable(False, False)
app.mainloop()
上記スクリプトを実行し、ウィンドウのサイズを変更し用としてみてもサイズが変更できないことが確認できると思います。
resizable
は、仕様上は幅と高さそれぞれに対してサイズの変更の有効 / 無効を設定できるようになっているはずですが、どうも私が試した限りでは「一方でも True
だと両方有効になる」という振る舞いになってしまいました…。
Tkinter のバージョンにもよるのかもしれませんが、同じ現象が起きるかもしれませんので注意してください。
ちなみに minsize
と maxsize
をうまく利用することにより、ウィンドウのサイズ変更の有効 / 無効を設定することも可能です。
例えば下記のように minsize
と maxsize
の第1引数に同じ値を指定すれば、幅のサイズ変更は無効になり、高さのみサイズ変更が可能になります。
import tkinter
app = tkinter.Tk()
app.minsize(500, 100)
app.maxsize(500, 600)
app.mainloop()
スポンサーリンク
destroy
destroy
はメインウィンドウ上のウィジェットを全て破棄して直ちにアプリを終了するメソッドになります。
destroy(self)
引数は不要です。
アプリの終了ボタン(Mac だとアプリ画面左上の赤丸、Windows だとアプリ画面右上の×ボタン)がクリックされた時にもこの destroy
メソッドが実行されます。
直ちにアプリを終了させたい場合に destroy
メソッドは有効です。
使用例は次の protocol
で合わせて紹介します。
protocol
protocol
はメインウィンドウに対するイベントを受付の処理を設定するメソッドの1つになります。
例えば終了ボタンでウィンドウが閉じられる場合は、WM_DELETE_WINDOW
という名前のイベントが発生します。
通常はこのイベントが発生すると、destroy
メソッドが実行されてアプリが終了しますが、protocol
メソッドを利用すると、その処理を横取りして他の処理に置き換えることができます。
protocol(self, name=None, func=None)
第1引数にはイベント名、第2引数にはそのイベント発生時に実行する関数名を設定します。
import tkinter
def no_destroy():
print("終了しません")
app = tkinter.Tk()
app.protocol("WM_DELETE_WINDOW", no_destroy)
app.mainloop()
上記のスクリプトを実行すると、アプリの終了ボタンを押してもアプリが終了しなくなります(強制終了の仕方がわからない方は実行しない方が良いです…)。
これは、WM_DELETE_WINDOW
イベント(終了ボタンでウィンドウが閉じられる際に発生するイベント)発生時に実行する関数が destroy
ではなく no_destroy
に置き換わったためです。
例えば下記のようにメッセージボックスを使用すれば、終了ボタンがクリックされた際にメッセージボックスを表示し、「OK」ボタンが押された場合のみ destroy
が実行するようにもできます。
import tkinter
from tkinter import messagebox
def ask_destroy():
global app
ret = messagebox.askokcancel(
"終了の確認",
"本当に終了しますか?"
)
if ret:
app.destroy()
app = tkinter.Tk()
app.protocol("WM_DELETE_WINDOW", ask_destroy)
app.mainloop()
実行結果は下のアニメーションのような感じになります。
イベントに関しては他にも様々なメソッドが用意されています。
このイベントに関しては別ページを用意して解説していきたいと思います。
update
update
は実行時点でメインウィンドウを現状の設定で画面に表示するメソッドになります。
前述の通り、基本的にはメインウィンドウやその他のウィジェットは mainloop
での処理時に画面に表示されたり設定の変更が反映されたりします。
しかし、この update
を実行すれば、mainloop
に入る前に直ちに画面への表示が設定変更の反映を行うことができます。
update(self)
引数は不要です。
スポンサーリンク
config
config
はメインウィンドウに対して各種設定を行うメソッドになります。configure
も同じく config
同様のメソッドになります。
config(self, cnf=None, **kw)
設定したいキーワードを用いて「キーワード=設定値
」の形式(キーワード引数)で指定します。
どんなキーワードが使用できるかは keys
メソッドを実行することで確認することが可能です。
import tkinter
app = tkinter.Tk()
print(app.keys())
実行すると下記のようにキーワード一覧が表示されます。例えば、’bg
‘ はメインウィンドウの背景色、 ‘cursor
‘ はカーソルの形式を指定するためのキーワードになります。
['bd', 'borderwidth', 'class', 'menu', 'relief', 'screen', 'use', 'background', 'bg', 'colormap', 'container', 'cursor', 'height', 'highlightbackground', 'highlightcolor', 'highlightthickness', 'padx', 'pady', 'takefocus', 'visual', 'width']
同じ感じで、config
メソッドを「引数なし」で実行すれば、各キーワードに対する現在の設定値を取得することもできます。
下記はマウスカーソルをハートに、メインウィンドウの背景を赤色に設定するスクリプトになります。
import tkinter
app = tkinter.Tk()
app.config(
cursor="heart",
bg="red",
)
app.mainloop()
実行すると下の図のようなメインウィンドウが表示されます(カーソルはキャプチャできなかったで表示されていません….)。
この config
メソッドは全ウィジェットで使用できるので、使い方や使用できるキーワードの調べ方は覚えておきましょう!
まとめ
このページでは、Tkinter でメインウィンドウを作成する方法について解説しました。
メインウィンドウは Tk
クラスのインスタンスを生成するだけで作成することができます。
この作成したメインウィンドウは Tk
クラスのメソッドを利用して様々な操作・設定を行うことも可能です。
特に mainloop
は Tkinter のアプリ開発では非常に重要ですので、忘れず実行するようしましょう!
オススメ参考書(PR)
Tkinter に興味がある方には下記のPythonでつくる ゲーム開発 入門講座がオススメです。
Tkinter をゲーム開発を通して「楽しく学ぶ」ことができます。Python 入門者、Tkinter 入門者の方にオススメです。