tkinter でも png 画像は読み込めるので、
このプログラムの場合は cv2 を使う必要はありませんが、
元のコードを動かす方法。
画像の部分は、実際のケースではプロットを表示するなら
tk.Canvas の代わりに FigureCanvasTkAgg を使います。
参考: matplotlib -- Embedding in Tk
python
1
2import tkinter as tk
3import tkinter.ttk as ttk
4
5from matplotlib import pyplot as plt
6from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
7import cv2
8from PIL import Image, ImageTk
9
10class TkPlotWindow:
11 """
12 tk組込用の pyplot の代替クラス
13 """
14
15 def __init__(self, master):
16 self.master = master
17 self.image = None
18
19 def imshow(self, image):
20 # 画像を tk で扱える形に変換
21 image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
22 image = Image.fromarray(image)
23 self.image = ImageTk.PhotoImage(image)
24
25 def show(self, modal=True):
26 image = self.image
27 if not image:
28 return
29
30 width, height = image.width(), image.height()
31 cx, cy = width//2, height//2
32
33 # ダイアログ生成
34 top = tk.Toplevel(self.master)
35 top.image = self.image
36 canvas = tk.Canvas(top, width=width, height=height)
37 canvas.create_image(cx, cy, image=self.image)
38 canvas.pack(fill=tk.BOTH, expand=tk.YES)
39
40 if modal:
41 # ウィンドウが閉じられるまで待つ
42 top.grab_set()
43 top.wait_window(top) # <-- イベントループ
44
45
46def img_open():
47 img1 = cv2.imread('1.png')
48 img2 = cv2.imread('2.png')
49 img3 = cv2.imread('3.png')
50
51 plt = TkPlotWindow(root) # NOTE: <-- 代替クラスを使う
52 plt.imshow(img1)
53 plt.show()
54 plt.imshow(img2)
55 plt.show()
56 plt.imshow(img3)
57 plt.show()
58
59
60if __name__ == "__main__":
61 root = tk.Tk()
62 root.title("")
63 root.geometry("")
64 btn1 = tk.Button(root)
65 btn1.configure(text="test", command=img_open)
66 btn1.pack(anchor="ne")
67
68 # ※ matplotlib 組み込みの場合必要な終了処理
69 def _quit():
70 root.quit()
71 root.destroy()
72 root.protocol("WM_DELETE_WINDOW", _quit)
73
74 root.mainloop()
75