tkinterの処理を軽くしたい

python

import tkinter as tk from PIL import Image, ImageTk import datetime #新規ウィンドウを作成root = tk.Tk()root.title("SVV測定")root.attributes("-fullscreen", True) #画面サイズの指定WIDTH = root.winfo_screenwidth()HEIGHT = root.winfo_screenheight() #ウィンドウ上にフレームを作成frame = tk.Frame(root)frame.place(x = -5, y = -5, width = WIDTH + 10, height = HEIGHT + 10) #フレーム上に、キャンバスを作成canvas = tk.Canvas(frame, width = WIDTH, height = HEIGHT, bg = "black")canvas.place(x = 0, y = 0, width = WIDTH + 10, height = HEIGHT + 10) #画像のプリセット角を"cs"として定義cs = 0 #キャンバスにSVV画像を貼り付けimg = Image.open("D:\EXPERIMENT\programming\Python\SVV\svv_bar.png")img = img.rotate(cs)tkimg = ImageTk.PhotoImage(img, width = WIDTH, height = HEIGHT)canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg, anchor="center", tags="img") #キャンバスに、透明な画像を貼り付けimg_snow = Image.open("D:\EXPERIMENT\programming\Python\SVV\svv_snow.png")tkimg_snow = ImageTk.PhotoImage(img_snow, width = WIDTH, height = HEIGHT)canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg_snow, anchor="center", tags="img_snow") #"c"の初期値を定義c = 0 #角速度の指定interval = datetime.timedelta(milliseconds = 20) #イベントが発生したときの処理def press_L(event): global interval next_time = datetime.datetime.now() + interval #左クリックの回数によって、左回転させる global img global tkimg global c c = c + 0.1 canvas.delete("all") IMG = img.rotate(c, resample = Image.BICUBIC) tkimg = ImageTk.PhotoImage(IMG) canvas.create_image(WIDTH/2, HEIGHT/2, image = tkimg, anchor = "center", tags = "img") canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg_snow, anchor = "center", tags="img_snow") now = datetime.datetime.now() delay_ms = int((next_time - now).total_seconds() * 1000) id = root.after(delay_ms, press_L, None) def stop_L(event): #左クリックで、左回転をストップする root.after_cancel(id) canvas.tag_bind("img_snow", "<ButtonPress-1>", press_L) canvas.tag_bind("img_snow", "<ButtonPress-3>", press_R) def stop_L_by_R(event): #右クリックでも、左回転をストップする root.after_cancel(id) canvas.tag_bind("img_snow", "<ButtonPress-3>", press_R) canvas.tag_bind("img_snow", "<ButtonPress-1>", stop_L) canvas.tag_bind("img_snow", "<ButtonPress-3>", stop_L_by_R) def press_R(event): global interval next_time = datetime.datetime.now() + interval #右クリックの回数によって、右回転させる global img global tkimg global c c = c - 0.1 canvas.delete("all") IMG = img.rotate(c, resample = Image.BICUBIC) tkimg = ImageTk.PhotoImage(IMG) canvas.create_image(WIDTH/2, HEIGHT/2, image = tkimg, anchor = "center", tags = "img") canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg_snow, anchor = "center", tags="img_snow") now = datetime.datetime.now() delay_ms = int((next_time - now).total_seconds() * 1000) id = root.after(delay_ms, press_R, None) def stop_R(event): #右クリックで、右回転をストップする root.after_cancel(id) canvas.tag_bind("img_snow", "<ButtonPress-3>", press_R) canvas.tag_bind("img_snow", "<ButtonPress-1>", press_L) def stop_R_by_L(event): #左クリックでも、右回転をストップする root.after_cancel(id) canvas.tag_bind("img_snow", "<ButtonPress-1>", press_L) canvas.tag_bind("img_snow", "<ButtonPress-3>", stop_R) canvas.tag_bind("img_snow", "<ButtonPress-1>", stop_R_by_L) def finish(event): #Enterキーを押すことで全画面表示を終了し、回転角度を取得する root.destroy() print(-c) #左クリックで呼び出すイベントcanvas.tag_bind("img_snow", "<ButtonPress-1>", press_L) #右クリックで呼び出すイベントcanvas.tag_bind("img_snow", "<ButtonPress-3>", press_R) #Enterキーで呼び出すイベントroot.bind("<Return>", finish) #メインループroot.mainloop()

コメントを投稿

0 コメント