今日も見に来てくださって、ありがとうございます。石川さんです。
今日は、キャンバスの切り替えのやり方です。透明なキャンバスを二枚重ねる方法はないかと調べていたのですが、見つからず、かわりにフレームを切り替える方法を見つけましたので、紹介します。
できあがりイメージ
初期表示画面は以下のように三角形を描いてあります。

キャンバスをクリックすると次のように切り替わります。

ソースコード
import tkinter as tk
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title("test")
self.frames = {}
self.frames["top"] = top = tk.Frame(self,width=300,height=200)
topcanvas = tk.Canvas(top)
topcanvas.place(x=0, y=0)
topcanvas.create_oval(30,30,270,170,outline="blue",fill="white")
top.grid(row=0,column=0)
self.frames["bottom"] = bottom = tk.Frame(self,width=300,height=200)
bottomcanvas = tk.Canvas(bottom)
bottomcanvas.place(x=0, y=0)
bottomcanvas.create_polygon(150,30,30,170,270,170,fill="lightgrey")
bottom.grid(row=0,column=0)
self.bind("<ButtonPress>", self.clicked)
self.frame = "top"
def clicked(self, event):
self.frames[self.frame].tkraise()
if self.frame == "top":
self.frame = "bottom"
else:
self.frame = "top"
if __name__ == "__main__":
app = App()
app.mainloop()
説明
クリックしたら描かれたキャンバスが切り替わります。正確には、フレームが切り替わります。まずは、アプリケーション作成、いつものようにtkinterのTkを継承してクラスを開始しています。__init__メソッドでは、最初にsuper().__init__()と記述して、親クラスTkの__init__()初期化メソッドを呼び出しています。その後、タイトルをセットして、self.framesをディクショナリとして初期化しています。
9行目でフレームを作成、10行目でそのフレーム上にキャンバスを作成します。11行目でplaceを使って配置しています。12行目でキャンバスへ楕円を描画しています。13行目でフレームをgridを使って配置しています。作ったフレームはディクショナリにセットしています。
15~19行目、同様にフレームとキャンバスを作成、配置しています。21行目、クリックされたときに呼び出すメソッドをセット、作ったフレームはディクショナリにセットしています。
25行目、ここが実際のフレームの切り替えを実行している箇所です。ディクショナリに登録したフレームのtkraise()メソッドを呼び出して、フレームを最上位に移動しています。
フレームをたくさん作って、タイマーでパカパカ切り替えたら、アニメーションが作れそうですね。
まとめ
フレームの切り替え、やり方さえ知っていれば、簡単ですね。キャンバスを二枚重ねて表示する方法は、いまだ不明です。どなたか知っている方がいらっしゃれば、教えてください。

