【Python/Tkinter】画像ファイルをスクロールさせる

f:id:Jikoryuu:20200119093954p:plain

PILをインストールする必要があります
PILで扱える画像の種類はbmptiff、gif、jpg、pngtiffppm、pgmです
PILがインストールされてない場合はpipでインストールしてください

>pip install Pillow
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
root = tk.Tk()
root.geometry("600x400")
imgpass=tk.StringVar(value='')
# 画像を表示
def open_file():
  # ファイルダイアログ
  typ = [('画像ファイル', '*.jpg;*.jpeg;*.png;*.bmp;*.gif;*.tiff;*.ppm;*.pgm')]
  imgpass.set(filedialog.askopenfilename(filetypes = typ))
  if imgpass.get()=="":
    return 0
  # 表示するイメージを用意
  global img
  rimg = Image.open(imgpass.get())
  img = ImageTk.PhotoImage(rimg)
  canvas.create_image(0,0,image=img,tag="illust",anchor=tk.NW)
  # Canvasのスクロール範囲を設定
  canvas.config(scrollregion=(0,0,rimg.width,rimg.height))
# アプリケーションを終了
def close_disp():
  root.quit()
# メニューを作成
men = tk.Menu(root) 
root.config(menu=men)
menu_file = tk.Menu(root)
men.add_cascade(label='ファイル', menu=menu_file)
menu_file.add_command(label='開く', command=open_file) 
menu_file.add_separator() 
menu_file.add_command(label='終了する', command=close_disp)
# Canvas Widget を生成して配置
canvas = tk.Canvas(root)
canvas.grid(row=0,column=0,sticky=tk.W + tk.E + tk.N + tk.S)
root.grid_columnconfigure(0,weight=1)
root.grid_rowconfigure(0,weight=1)
# Scrollbar を生成して配置
barX = tk.Scrollbar(root, orient=tk.HORIZONTAL)
barX.grid(row=1, column=0, sticky="ew")
barY = tk.Scrollbar(root, orient=tk.VERTICAL)
barY.grid(row=0, column=1, sticky="ns")
# Scrollbarを制御をCanvasに通知する処理を追加
barY.config(command=canvas.yview)
barX.config(command=canvas.xview)
# Canvasの可動域をScreoobarに通知する処理を追加
canvas.configure(yscrollcommand=barY.set, xscrollcommand=barX.set)
canvas.configure(xscrollcommand=barX.set, yscrollcommand=barY.set)
# マウスホイールに対応
barY.bind('<MouseWheel>', lambda e:canvas.yview_scroll(-1*(1 if e.delta>0 else -1),tk.UNITS))
barY.bind('<Enter>',lambda e:barY.focus_set())
canvas.bind('<MouseWheel>', lambda e:canvas.yview_scroll(-1*(1 if e.delta>0 else -1),tk.UNITS))
canvas.bind('<Enter>',lambda e:barY.focus_set())
barX.bind('<MouseWheel>', lambda e:canvas.xview_scroll(-1*(1 if e.delta>0 else -1),tk.UNITS))
barX.bind('<Enter>',lambda e:barX.focus_set())

root.mainloop()