今日も見に来てくださって、ありがとうございます。石川さんです。
GUIのエディターを作ったときに、アウトラインを表示する方法をちょっと検討してみました。キャンバスの中にcreate_window()でキャンバスを作成して、同じ内容を描画する、というのでどうかなぁ、ということで、ちょっとお試ししてみました。
できあがりイメージ

クリックした個所に四角形を描画します。描画と同時に右下のアウトラインにも描画します。
ソースコード
ソースコードは以下の通りです。
import tkinter as tk
class Application(tk.Tk):
def __init__(self):
super().__init__()
self.title("Canvas outline sample")
self.outline = None
self.outline_item = None
self.canvas = tk.Canvas(self, background="white")
self.canvas.pack(fill=tk.BOTH,expand=True)
self.canvas.bind("<1>",self.update_outline)
self.canvas.bind("<Configure>",self.update_outline)
def update_outline(self, event):
if self.outline == None or self.outline_item == None:
self.outline = o = tk.Canvas(self, background="lightblue")
c = self.canvas
width, height = c.winfo_width(), c.winfo_height()
w, h = width//5, height//5
x, y = width - w//2, height - h//2
self.outline_item = c.create_window(x, y, width=w, height=h, window=o)
return
if event.type == tk.EventType.Configure:
c = self.canvas
width, height = c.winfo_width(), c.winfo_height()
w, h = width//5, height//5
x, y = width - w//2, height - h//2
oi = self.outline_item
x0, y0 = c.coords(oi)
dx = x - x0
dy = y - y0
c.move(oi,dx,dy)
c.itemconfigure(oi,width=w,height=h)
elif event.type == tk.EventType.Button:
c = self.canvas
x, y = event.x, event.y
c.create_rectangle(x, y, x+100, y+100)
o = self.outline
o.create_rectangle(x//5,y//5,(x+100)//5,(y+100)//5)
if __name__ == "__main__":
application = Application()
application.mainloop()
ウィンドウのサイズを変更したら、アウトラインのサイズも変更されます。
まとめ
今回は、クリックしたときに同時に小さいサイズの描画をしました。実際のGUIエディターでは、アウトラインの表示、非表示の切り替えができるようにする必要がありそうですね。スクロールとか、拡大縮小も対応しなければいけないでしょうね。

