前提
Pythonで、表示させた画像をクリック操作によって回転させるコードを作成しています。
「クリックごとに回転させる」ことは出来ましたが、「マウスの長押し」に対応させられていません。
実現したいこと
ボタンウィジェットを用いずに、ボタンウィジェットのrepeatdelay、repeatintervalのような「ボタン長押しで、何度もボタンをクリックしたことにする」処理を実現したいです。
"press_L"および"press_R"のイベントの中に、そのようなコードを組み込めればと考えています。
発生している問題・エラーメッセージ
特にありません。
該当のソースコード
Python
1import tkinter as tk 2from PIL import Image, ImageTk 3 4 5#画面サイズの指定 6WIDTH = 1300 7HEIGHT = 800 8 9 10#新規ウィンドウを作成 11root = tk.Tk() 12root.title("SVV測定") 13root.attributes("-fullscreen", True) 14 15 16#ウィンドウ上にフレームを作成 17frame = tk.Frame(root) 18frame.pack() 19 20 21#フレーム上に、キャンバスを作成 22canvas = tk.Canvas(frame, width = WIDTH, height = HEIGHT, bg = "black") 23canvas.pack() 24 25 26#"c"の初期値を定義 27c = 0 28 29 30#キャンバスにSVV画像を貼り付け 31img = Image.open("D:\EXPERIMENT\programming\Python\SVV\svv_bar.png") 32img = img.rotate(c) 33tkimg = ImageTk.PhotoImage(img, width = WIDTH, height = HEIGHT) 34canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg, anchor="center", tags="img") 35 36 37#キャンバスに、透明な画像を貼り付け 38img_snow = Image.open("D:\EXPERIMENT\programming\Python\SVV\svv_snow.png") 39tkimg_snow = ImageTk.PhotoImage(img_snow, width = WIDTH, height = HEIGHT) 40canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg_snow, anchor="center", tags="img_snow") 41 42 43#イベントが発生したときの処理 44def press_L(event): 45 #左クリックの回数によって、左回転させる 46 global img 47 global tkimg 48 global c 49 c = c + 5 50 IMG = img.rotate(c) 51 tkimg = ImageTk.PhotoImage(IMG) 52 canvas.create_image(WIDTH/2, HEIGHT/2, image = tkimg, anchor = "center", tags = "img") 53 canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg_snow, anchor = "center", tags="img_snow") 54 55def press_R(event): 56 #右クリックの回数によって、右回転させる 57 global img 58 global tkimg 59 global c 60 c = c - 5 61 IMG = img.rotate(c) 62 tkimg = ImageTk.PhotoImage(IMG) 63 canvas.create_image(WIDTH/2, HEIGHT/2, image = tkimg, anchor = "center", tags = "img") 64 canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg_snow, anchor = "center", tags="img_snow") 65 66def finish(event): 67 #Enterキーを押すことで全画面表示を終了し、回転角度を取得する 68 root.destroy() 69 print(c) 70 71 72#左クリックで呼び出すイベント 73canvas.tag_bind("img_snow", "<ButtonPress-1>", press_L) 74 75#右クリックで呼び出すイベント 76canvas.tag_bind("img_snow", "<ButtonPress-3>", press_R) 77 78#Enterキーで呼び出すイベント 79root.bind("<Return>", finish) 80 81 82#メインループ 83root.mainloop()
上記の処理に使用した画像を作成するコード
Python
1#---SVV測定に使用する画像の作成--- 2 3from PIL import Image, ImageDraw 4 5#背景色が黒色のキャンパスを作成。 6im = Image.new('RGB', (500, 500), (0, 0, 0)) 7draw = ImageDraw.Draw(im) 8 9 10#中央に線を描画 11draw.line((50, 250, 450, 250), fill=(255, 255, 255), width=10) 12 13 14#同じサイズの画像を作成 15im_clear = Image.new("RGBA", im.size, (0, 0, 0, 0)) 16width = im.size[0] 17height = im.size[1] 18 19 20#色ごとに処理 21for x in range(width): 22 for y in range(height): 23 pixel = im.getpixel( (x, y) ) 24 25 # 黒なら処理しない 26 if pixel[0] == 0 and pixel[1] == 0 and pixel[2] == 0: 27 continue 28 29 # 黒以外なら、用意した画像にピクセルを書き込み 30 im_clear.putpixel( (x, y), pixel ) 31 32 33#SVVで表示させるバーをpng形式で保存 34im_clear.save("D:\EXPERIMENT\programming\Python\SVV\svv_bar.png", quality=100) 35 36 37 38#---透明なpng画像の作成--- 39 40#画像サイズの指定 41WIDTH = 1500 42HEIGHT = 1000 43 44 45#新しい画像を作成 46im_snow = Image.new("RGBA", (WIDTH, HEIGHT), (0, 0, 0, 0)) 47 48 49#新しい画像をもう一つ作成 50im_snow2 = Image.new("RGBA", (WIDTH, HEIGHT), (0, 0, 0, 0)) 51 52 53#色ごとに処理 54for x in range(width): 55 for y in range(height): 56 pixel = im_snow2.getpixel( (x, y) ) 57 58 # 黒なら処理しない 59 if pixel[0] == 0 and pixel[1] == 0 and pixel[2] == 0: 60 continue 61 62 # 黒以外なら、用意した画像にピクセルを書き込み 63 im_snow.putpixel( (x, y), pixel ) 64 65 66#透明な画像をpng形式で保存 67im_snow.save("D:\EXPERIMENT\programming\Python\SVV\svv_snow.png", quality=100) 68
試したこと
もともとボタンウィジェットを用いた方法で進めていましたが、ボタンウィジェットを透明にする方法が無さそうでしたので、現在の「透明な画像を重ねる」方法をとっています。
補足情報(FW/ツールのバージョンなど)
AnacondaでPythonを使用しています。
・Anacondaのバージョン:conda 4.12.0
・Pythonのバージョン:Python 3.9.12
・Windowsのバージョン:version 21H2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。