質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

解決済

Python3 Tkinter 画像の拡大縮小について

person
person

総合スコア180

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

2回答

0評価

0クリップ

6447閲覧

投稿2020/04/14 23:33

編集2020/04/16 04:29

画像の拡大縮小を行いたいです。

調べたところ canvas.scale というのを使えば実現できそうなのですが、実際に画像に反映されません。

自分的にはcanvas.scaleに設定するIDが間違っていると思うのですが、実際のところ何が間違っているのでしょうか?

回答よろしくお願いします。

該当ソース

Python

from decimal import Decimal import tkinter as tk class App: def __init__(self, win): self.win = win self.win.geometry("500x500") self.img_disp_flag = False def view_create(self): self.win.rowconfigure(0, weight=1) self.win.columnconfigure(0, weight=1) self.frame_viewer = tk.Frame(win) self.frame_viewer.grid(row=0, column=0, sticky="nsew") self.frame_button = tk.Frame(win) self.frame_button.grid(row=1, column=0, sticky="nsew") self.frame_viewer.rowconfigure(0, weight=1) self.frame_viewer.columnconfigure(0, weight=1) self.canvas = tk.Canvas(self.frame_viewer) self.canvas.grid(row=0, column=0, sticky="nsew") self.ysb = tk.Scrollbar(self.frame_viewer, width=20, orient="vertical", command=self.canvas.yview) self.canvas.configure(yscrollcommand=self.ysb.set) self.ysb.grid(row=0, column=1, sticky="ns") self.xsb = tk.Scrollbar(self.frame_viewer, width=20, orient="horizontal", command=self.canvas.xview) self.canvas.configure(xscrollcommand=self.xsb.set) self.xsb.grid(row=1, column=0, sticky="ew") self.scale_up_button = tk.Button(self.frame_button, text="+", width=2) self.scale_up_button.grid(row=0, column=0, padx=5, pady=5) self.scale_down_button = tk.Button(self.frame_button, text="-", width=2) self.scale_down_button.grid(row=0, column=1, padx=5, pady=5) self.scale_default_button = tk.Button(self.frame_button, text="±0", width=2) self.scale_default_button.grid(row=0, column=2, padx=5, pady=5) self.img_disp_button = tk.Button(self.frame_button, text="img_disp") self.img_disp_button.grid(row=0, column=3, padx=5, pady=5) self.img_hide_button = tk.Button(self.frame_button, text="img_hide") self.img_hide_button.grid(row=0, column=4, padx=5, pady=5) self.scale = Decimal("1.0") self.canvas.scale("all", 0, 0, self.scale, self.scale) # バインド def bind_event(self): self.canvas.bind("<MouseWheel>", lambda e:self.wheel_rotated(e, app)) self.scale_up_button.bind("<ButtonRelease>", lambda e:self.zoom_up(e, app)) self.scale_down_button.bind("<ButtonRelease>", lambda e:self.zoom_down(e, app)) self.scale_default_button.bind("<ButtonRelease>", lambda e:self.zoom_default(e, app)) self.img_disp_button.bind("<ButtonRelease>", lambda e:self.img_disp(e, app)) self.img_hide_button.bind("<ButtonRelease>", lambda e:self.img_hide(e, app)) # 画像上でマウスホイールを動かしたとき def wheel_rotated(self, e, app): # 垂直スクロールバーのみマウスホイールに対応(水平には対応できないか・・・) # https://stackoverflow.com/questions/17355902/python-tkinter-binding-mousewheel-to-scrollbar self.canvas.yview_scroll(int(-1*(e.delta/120)), "units") # 画像の拡大 def zoom_up(self, e, app): self.scale += Decimal("0.1") self.canvas.scale("current", 0, 0, self.scale, self.scale) print(self.scale) # 画像の縮小 def zoom_down(self, e, app): self.scale -= Decimal("0.1") self.canvas.scale("current", 0, 0, self.scale, self.scale) print(self.scale) # 倍率をデフォルトに戻す def zoom_default(self, e, app): self.scale = Decimal("1.0") self.canvas.scale("current", 0, 0, self.scale, self.scale) print(self.scale) """ canvas.scale(ID, x0, y0, rx, ry) ID オブジェクトのID x0 基準となるx座標 y0 基準となるy座標 rx x座標の拡大率 ry y座標の拡大率 """ # 画像の表示 def img_disp(self, e, app): if self.img_disp_flag == False: self.imgfile = "c:\Users\ユーザ名\Desktop\scale_test\test.png" self.img = tk.PhotoImage(file=self.imgfile) self.disp_image = self.canvas.create_image(0, 0, image=self.img, anchor=tk.NW) self.canvas.config(scrollregion=app.canvas.bbox("all")) self.img_disp_flag = True else: print("Already image displayed!") # 画像の非表示 def img_hide(self, e, app): if self.img_disp_flag == True: self.canvas.delete(self.disp_image) self.img_disp_flag = False else: print("Already image hidden!") if __name__ == "__main__": win = tk.Tk() app = App(win) app.view_create() app.bind_event() win.mainloop()

追記(subsample()による縮小、scaleが0以下だと拡大が意図した動作とは違う動作になる)

def zoom_up(self, e, app): if self.img_disp_flag == True: self.canvas.delete(self.disp_image) self.scale -= 1 self.img_zoom_up = self.img.subsample(self.scale, self.scale) #self.img_zoom_up = self.img.zoom(x=self.scale, y=self.scale) self.disp_image = self.canvas.create_image(0, 0, image=self.img_zoom_up, anchor=tk.NW) self.img_x_zoom_up = self.img_zoom_up.width() self.img_y_zoom_up = self.img_zoom_up.height() print("size:", self.img_x_zoom_up, self.img_y_zoom_up) print("scale:", self.scale) else: print("Not displaying an image yet!") def zoom_down(self, e, app): if self.img_disp_flag == True: self.canvas.delete(self.disp_image) self.scale += 1 self.img_zoom_down = self.img.subsample(self.scale, self.scale) self.disp_image = self.canvas.create_image(0, 0, image=self.img_zoom_down, anchor=tk.NW) self.img_x_zoom_down = self.img_zoom_down.width() self.img_y_zoom_down = self.img_zoom_down.height() print("size:", self.img_x_zoom_down, self.img_y_zoom_down) print("scale:", self.scale) else: print("Not displaying an image yet!") def zoom_default(self, e, app): if self.img_disp_flag == True: self.canvas.delete(self.disp_image) self.scale = 1 self.img_zoom_default = self.img.subsample(self.scale, self.scale) self.disp_image = self.canvas.create_image(0, 0, image=self.img_zoom_default, anchor=tk.NW) print("size:", self.img_x, self.img_y) print("scale:", self.scale) else: print("Not displaying an image yet!")

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。