第 3 章 フレーム

◀ 3.14 フレームの削除、非表示   【目  次】  3.16 前面、背面表示 ▶

999999

 更新日:


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

3.15 透明度、透過色(container、use、winfo_id、wm_attributes、attributes)

フレーム全体を透けて見えるようにしたり、特定の色を透明にしたりするメソッドはありませんが、サブウィンドウをフレームに埋め込むことにより、その機能を実現することができます。「固有オプション」で定義されている「container」オプションに「True」を指定してサブウィンドウ(トップレベルウィンドウ)を埋め込みます。埋め込まれるサブウィンドウの「use」オプションにフレームの識別子を設定します(2. 2 オプションパラメータ 参照)。フレームの識別子は Misc クラス の下記の「winfo_id」メソッドで取得します。詳細は Misc クラスメソッドを参照して下さい。

object.winfo_id()

透過度と透明色の設定は埋め込んだサブウインドウの「wm_attributes」または「attributes」メソッドの「-alpha」と「-transparentcolor」オプションを用います(2.24 Windows 固有の属性(アトリビュート)) 参照)。

サブウィンドウを埋め込んだフレームは、そのオプションの設定が無視されます。フレームの表示とサイズ設定はフレームの「place」、「pack」または「grid」メソッドを用いることができます(3.1 フレームの作成 参照)。

埋め込まれたサブウィンドウは、そのオプションでの設定が有効になりますが、 Wm クラスメソッド のほとんどは利用することができません。唯一、本節での「wm_attributes」または「attributes」メソッドが利用できます。

「-alpha」と「-transparentcolor」オプションの設定はメインウィンドウ 1.24 Windows 固有の属性(アトリビュート)またはサブウィンドウでの 2.24 Windows 固有の属性(アトリビュート)と同じですが、その表示はウィンドウの場合と少し異なります。ウィンドウの場合は透けた部分でその背面のスクリーンの画像が見えるようになりました。フレームに適用した場合、同様にフレームは透けますが、スクリーンの画像は見えません。フレームの背面の画像が見えるようになります。

フレームの削除、非表示は 3.14 フレームの削除、非表示で実行できます。サブウィンドウを「destroy」メッセージで削除すると、サブウィンドウは削除されますがフレームは「container」オプションが「True」のままで(「container」オプションは変更できません)、動作は保証されません(筆者の環境では「-transparentcolor」オプションの設定が適用されたままになります)。


次のプログラムは黄色の背景のフレーム「frame」を作成して「place」メソッドでメインウィンドウに配置しています。次いで、ピンク色の背景のフレーム「frame_0」を作成して「container」オプションに「True」を指定して、「place」メソッドでメインウィンドウに配置しています。

赤色の背景のサブウィンドウ「sub」をメインウィンドウの子オブジェクトとして作成ます。背景色を赤色として、「use」オプションに「frame_0」の識別子を設定します。この設定でサブウィンドウ「sub」はフレーム「frame_0」に格納され(埋め込まれ)ます。

透過の設定を見るために緑色の背景のフレーム「frame_1」を作成してサブウィンドウ「sub」に配置します。

「update」メソッドでオブジェクトの設定を完了した後、「wm_attributes」メソッドで緑色を透過色に設定し、サブウィンドウの透過度を「0.8」に設定しています。ここで、「wm_attributes」メソッドの実行前に、「update」メソッドを実行するか、「lift」メソッドで「frame_0」の前面に表示しないと、「wm_attributes」メソッドは適用されません。

「wm_deiconify」メソッドでメインウィンドウをアクティブにしています。

1
import tkinter as tk
2
root = tk.Tk()
3
root['bg'] = 'blue'
4
root.geometry('300x200+100+100')
5
frame = tk.Frame(root, bg='yellow')
6
frame.place(x=0, y=0,width=200, height=150)
7
frame_0 = tk.Frame(root, bg='pink', container=True)
8
frame_0.place(x=10, y=10, width=200, height=160)
9
sub = tk.Toplevel(root, bg='red', use=frame_0.winfo_id())
10
frame_1=tk.Frame(sub, bg='green')
11
frame_1.place(x=10,y=10,width=100,height=100)
12
root.update()
13
sub.wm_attributes('-transparentcolor', 'green')
14
sub.wm_attributes('-alpha', 0.8)
14
root.wm_deiconify()
15
root.mainloop()

このプログラムを実行すると、下図のように赤色のフレーム(サブウィンドウ)が透けて表示され、その上に配置した緑色のフレームが透明になり下の黄色のフレームが見えるようになります。

A003_Frame_03-15