第 2 章 サブウィンドウ

◀ 第 2 章 サブウィンドウ   【目  次】  2. 2 オプションパラメータ ▶

999999

 更新日:


 このホームページは Amazon Kindle 本の作成中の草稿です。日々、原稿を見直しているので、内容が変わることに留意して読んで下さい。本が出版され次第、このホームページは削除されます。

2.1 サブウィンドウの作成

 サブウィンドウは tkinter の「Toplevel」クラスをインスタンス化することで作成します。

tkinter.Toplevel(master=None, cnf={}, **kw)
 サブウィンドウ(トップレベルウィンドウ)のクラス定義です。「Misc」および「Wm」クラスを継承しています。

引数
master
 メインウィンドウのオブジェクトを指定します。省略または「None」を指定するとデフォルトのアプリケーションのウィンドウが設定されます。
cnf

 設定するオプションのキーワードの文字列と値を辞書型で指定します。

**kw

 設定するパラメータの値をキーワードで指定します。


メソッド
destroy()
このウィンドウとすべてのウィジェットを破棄します。ウィンドウが存在しなくてもエラーは返されません。
getdouble(x)
 引数「x」に指定した数値および数文字を浮動小数点に変換します。Python 組み込み関数「float」と同じです。
getint(x)
 引数「x」に指定した整数値および整数文字を整数値に変換します。Python 組み込み関数「int」に似ていますが、小数点数値は整数値に変換しません。n 進数の変換は、n 進記号表示の文字列を指定します。
Misc クラスメソッド
Wm クラスメソッド

備考

 「Misc」クラスに特殊メソッドの「__setitem__」と「__getitem__」が定義されていて、オブジェクトからキーワードインデックスでオプションの値を設定、取得することができます。同様に、特殊メソッドの「__str__」が定義されていて、「str」関数でオブジェクトのパス名を取得することができます。

 「cnf」と「**kw」引数の両方を用いてオプションを設定することができます。それぞれの引数で同じオプションに別の値を設定すると「**kw」引数での設定値が有効になります。

 サブウィンドウもシステムから見ればメインウィンドウと同じウィンドウとして動作するので、1.27 項の複数のメインウィンドウの場合と同様に、作成するときにシステムに明示的にそのスタック順(表示順)を指定しないと、動作が不定になります。1.27 複数のメインウィンドウを参照して下さい。

 アプリケーションでウィンドウのスタック順を指定するには 1.27 項の複数のメインウィンドウの場合と同様に、Wm クラス「wm_deiconify」または「deiconify」メソッド、あるいはMisc クラス「lift」または「tkraise」メソッドを用います。このとき、メソッドの実行はメインおよびサブウィンドウの描画後に実行する必要があるので、「update」メソッドを先に実行します。

 サブウィンドウの作成を「mainloop」メソッドの実行後にイベント(ボタンなどの操作)で行う場合、メインウィンドウの場合と同様に、ウィンドウのスタックはイベント順に実行されるので「lift」または「tkraise」メソッドは必要ありませんが、フォーカスの設定は「focus_force」メソッドを用いる必要があります。「wm_deiconify」メソッドや「lift」メソッドを用いてもフォーカスは設定されません。

 次のプログラムはメインウィンドウ「root」とメインウィンドウに関連付けたサブウィンドウ「sub」を作成して表示しています。メインウィンドウの背景色は青色に、サブウィンドウの背景色は赤色に設定しています。「update」メソッドでウィンドウ描画のイベント処理後、「lift」メソッドでサブウィンドウを前面に表示しています。サブウィンドウを閉じてもメインウィンドウは残りますが、メインウィンドウを閉じるとサブウィンドウは一緒に閉じます。

1
import tkinter as tk
2
root = tk.Tk()
3
root.config(width=300, height=200, bg='blue')
4
root.geometry('+100+100')
5
sub = tk.Toplevel(root)
6
sub.config(width=300, height=200, bg='red')
7
sub.geometry('+140+120')
8
root.update()
9
sub.lift()
10
root.mainloop()

 このプログラムを実行すると、青色のメインウィンドウの前面に赤色のサブウィンドウが表示されます。ただ、「lift」メソッドを用いたこのプログラムではサブウィンドウを閉じたとき、メインウィンドウが他のウィンドウに隠れてしまう場合があります。

 次のプログラムは「lift」メソッドではなく「wm_deiconify」メソッドを用いています。「update」メソッドでウィンドウ描画のイベント処理後、最初に「wm_deiconify」メソッドでメインウィンドウを表示して、次いでサブウィンドウを表示します。「wm_deiconify」メソッドでウィンドウの表示が順にスタックされて、システムによってスタック順にメインウィンドウの前面にサブウィンドウが表示されます。このプログラムではサブウィンドウを閉じても、スタック順でメインウィンドウが表示されて他のウィンドウに隠れることはありません。

1
import tkinter as tk
2
root = tk.Tk()
3
root.config(width=300, height=200, bg='blue')
4
root.geometry('+100+100')
5
sub = tk.Toplevel(root)
6
sub.config(width=300, height=200, bg='red')
7
sub.geometry('+140+120')
8
root.update()
9
root.wm_deiconify()
10
sub.wm_deiconify()
11
root.mainloop()

  "