python 事始め (4) マウスで操作(第二弾)

以前作ったものに,大分近づいてきました。ウインドウライクの画面に操作ボタンを配置し,そのボタンで操
作できるようにしました。作っている過程で,プログラム的には,間違いが無いのに,思った動作をしないこ
とがでてきました。グーグル先生に聞いてみると,下記のHPにたどり着きました。

tkinterで画像が表示されない現象について(ガベージコレクション)

どうやら,サブルーチンで,画像表示をしていたのが原因のようで,サブルーチンでの表示だと,ガベージコ
レクションで,ローカル変数が消去されてしまうらしい。大昔,BASICでプログラムを組んでいた頃,良く聞
いた言葉でした。このHPのように変更したら,見事うごきました。

下記が,プログラムの全文です。

# ライブラリのインポート
import cv2
import tkinter as tk
from PIL import Image, ImageTk
import os

# ファイル名を配列に格納
file_names = ['00.jpg', '01.jpg', '02.jpg','03.jpg','04.jpg','05.jpg','06.jpg','07.jpg','08.jpg','09.jpg','10.jpg',\
		'11.jpg','12.jpg','13.jpg','14.jpg','15.jpg','16.jpg','17.jpg','18.jpg','19.jpg','20.jpg','21.jpg',\
		'22.jpg','23.jpg','24.jpg','25.jpg','26.jpg','27.jpg','28.jpg','29.jpg','30.jpg','31.jpg','32.jpg',\
		'33.jpg','34.jpg','35.jpg','36.jpg','37.jpg','38.jpg','39.jpg','40.jpg','41.jpg','42.jpg','43.jpg',\
		'44.jpg','45.jpg','46.jpg','47.jpg','48.jpg','49.jpg','50.jpg','51.jpg','52.jpg','53.jpg','54.jpg',\
		'55.jpg','56.jpg','57.jpg','58.jpg','59.jpg','60.jpg','61.jpg','62.jpg','63.jpg','64.jpg']

#グローバル変数の定期
img=file_names[0]
kaisu=0

# ベースパスを設定
base_path = 'E:/python-kaihatu/nanikana/mask-jp'

# tkオブジェクトの作成
root = tk.Tk()
root.title("なにかな") #ウィンドウのタイトルを設定
root.geometry("700x570") #ウィンドウのサイズを設定

### キャンバス作成
canvas=tk.Canvas(root,width=550, height=550)
canvas.place(x = 10,y = 10)

#背景画像を読み込み
img1 = cv2.imread('E:/python-kaihatu/nanikana/gazou/buta1.jpg')

def gazou_over():
	global kaisu

	# フルパスを作成
	full_path = os.path.join(base_path, file_names[kaisu])

	# マスクファイルを開く
	mask = cv2.imread(full_path)

	if mask is not None:
		#画像の合成
		result = cv2.bitwise_and(mask,img1)
		#BRG読み込みをRGBに変換
		result = cv2.cvtColor(result, cv2.COLOR_BGR2RGB)
		#フォーマットをPILに変換
		result = Image.fromarray(result)
	return result

imagetk_list = list()
def on_button_click():
	global kaisu,imagetk_list
	if  kaisu<64:
		kaisu= kaisu+1

		#旧画像の削除
		canvas.delete('p1')

		result= gazou_over()
		result=ImageTk.PhotoImage(result)
		imagetk_list.append(result)
		canvas.create_image(273,273,image = result,tag='p1')

def on_button1_click():
	global kaisu,imagetk_list
	if  kaisu>0:
		kaisu= kaisu-1

		#旧画像の削除
		canvas.delete('p1')

		result= gazou_over()
		result=ImageTk.PhotoImage(result)
		imagetk_list.append(result)
		canvas.create_image(273,273,image = result,tag='p1')

#PILでjpgを使用
img_pil=gazou_over()
img_pil=ImageTk.PhotoImage(img_pil)

#画像ファイルをキャンバスの(0,0)に合わせて表示
canvas.create_image(273,273,image = img_pil,tag='p1')

# イベント処理記述
button = tk.Button(root, text="開く", command=on_button_click, bg="cyan4", fg="white",width=8, height=1)
button.place(x=595, y=30)
button1 = tk.Button(root, text="閉じる", command=on_button1_click, bg="cyan4", fg="white",width=8, height=1)
button1.place(x=595, y=100)

# メインループの実行
root.mainloop()

次は,ファイルの読み込みを入れてみようかなと思います。