112011-04-12 01:33:20 samplebias. このページでは Python で Tkinter を用いて GUI アプリに画像を表示する方法について、サンプルスクリプトを用いて紹介していきます。, このページで紹介するサンプルスクリプトを実行すれば、下のように GUI アプリが起動し、, さらに「ファイル選択」ボタンから画像ファイル(.png や .gif など)を選択することで、画面の左側に画像が表示されるようになります。, また「縮小」ボタンを押せば、左側に表示されている画像を縮小したものが画面の右側に、「拡大」ボタンを押せば、左側に表示されている画像を拡大したものが画面の右側に表示されます。, Python で画像といえば Pillow や OpenCV などを利用するイメージが強いかもしれませんが、今回紹介するのは Tkinter(filedialog 含む)のみを利用して GUI アプリに表示する方法です。, GUI アプリに画像を表示するには、Tkinter の PhotoImage クラスを利用します。, PhotoImage クラスのオブジェクトを生成時に画像ファイルへのファイルパスを指定すれば、その画像を Tkinter で利用するためのオブジェクトに変換することができます。, ただし、Tkinter のみだと PhotoImage に指定できる画像ファイルは下記の形式のみになります(2020/4/17 時点)。, Pillow を利用すればもっと多くの画像形式を利用できるようになりますが、Tkinter だけだと上記のみしかた対応していないようです。少ない!, さらにその画像を Tkinter の Canvas クラスのメソッド create_image を利用して GUI アプリに画像を描画することが可能です。, 第1引数には描画する画像の中心の x 座標、第2引数には描画する画像の中心の y 座標を指定します。, PhotoImage クラスに用意されたメソッドを利用すれば、画像のリサイズを行うこともできます。, また、この PhotoImage クラスのオブジェクトに subsample メソッドを実行させることで画像を縮小することができます。、zoom メソッドを実行することで画像の拡大を行うことも可能です。, 第1引数には横方向の縮小率(大きい値ほど縮小される)、第2引数には縦方向の縮小率を指定します。第1引数のみを指定した場合、画像の縦横の両方向が、その縮小率に基づいて縮小されます。, PhotoImage クラスのオブジェクトに zoom メソッドを実行することで画像の拡大も行うこともできます。, 第1引数には横方向の拡大率(大きい値ほど拡大される)、第2引数には縦方向の拡大率を指定します。, 第1引数のみを指定した場合、画像の縦横の両方向が、その拡大率に基づいて縮小されます。, ただし、こちらも subsample メソッド同様に引数に指定できるのは整数のみです…。, ここまで紹介してきた PhotoImage クラスを利用して GUI アプリに画像を表示するサンプルスクリプトは下記のようになります。, このページの冒頭で説明した通り、このスクリプトを実行すると下の図のようなアプリが起動します。, アプリ起動後、「ファイル選択ボタン」から画像ファイルを選択すれば、その画像が画面の左側のキャンバスに描画されます。, また、画像が左側のキャンバスに描画された後に、「縮小」or「拡大」ボタンを押せば、リサイズ後の画像が右側のキャンバスに描画されます。, キャンバスのサイズは 400×400 に設定していますので、それより大きいサイズの画像を描画した場合は画像がキャンバスはみ出てしまう(表示されない)ので注意してください。, ここでは PhotoImage クラスを活用している下記の3つのメソッドについて解説したいと思います。, その他の部分は主に Tkinter を利用したスクリプトになっていますので、詳しくは下記ページを参考にしていただければと思います。, この push_load_button は「ファイル選択」ボタンが押された時に実行されるメソッドです。, まず askopenfilename 関数によりファイル選択画面を表示し、ユーザーからの画像のファイルパス選択を受け付けます。, ファイルパスが選択されれば、下記によりそのファイルパスの画像から Tkinter 用の画像オブジェクトが生成しています。, さらにオブジェクト生成後、Canvas クラスの create_image メソッドを利用してキャンバスに画像の描画を行っています。, self.before_canvas は画面左側のキャンバスのオブジェクトですので、上記により指定された画像が画面左側のキャンバスに描画されることになります。, push_subsample_button は「縮小」ボタンが押された時に実行されるメソッドです。, 最後に下記により縮小後の画像をキャンバス描画しています(キャンバスの中心に画像が描画されるように x と y を計算しています)。, は画面右側のキャンバスのオブジェクトですので、上記によりリサイズ後の画像が画面右側のキャンバスに描画されることになります。, push_zoom_button は「拡大」ボタンが押された時に実行されるメソッドで、基本的な処理は push_subsample_button と同様です。, ただしこちらのメソッドでは画像の拡大を行いますので、subsample メソッドではなく zoom メソッドを使用しています。, このページでは Tkinter を利用して GUI アプリに画像を表示する方法について解説しました。, Tkinter を使って簡単な画像処理も行ってみましたが、あくまでもこのページの目的は GUI アプリに画像を表示することです。, もっと豊富な形式の画像を読み込めるようにしたり、より高度な画像処理を行うためには OpenCV や Pillow を利用する方が良いです。, ただし、画像処理アプリを作成して画像をアプリ上に表示したい場合(例えば OpenCV での画像処理前後の画像を GUI アプリに表示する等)は、このページで解説した内容は役に立つと思いますのでしっかり理解しておくのが良いと思います。, ちなみに、PhotoImage クラスには get メソッドと put メソッドが用意されており、これらを使用してピクセル単位で画像を加工することも可能です。これについては下記ページで解説していますので、こちらも是非読んでみてください!, 「GUI アプリ作成に興味のある方」や「ゲーム開発に興味のある方」にはPythonでつくる ゲーム開発 入門講座がオススメです。, この本は、このページで紹介した Tkinter を中心に、「すごろく」や「RPG」・「落ちものゲーム」を開発しながら Python プログラミングを学べる参考書になります。 初心者向け解説も多く、 Python の基本から GUI アプリの開発・ゲーム開発について学ぶ事ができます。, また初心者の方にとっては、楽しく Python を学べる点がオススメの理由です。ゲーム開発を通して Python プログラミングを学ぶ事ができ、自分の作成したプログラムの動作を実際に目で確認できるので楽しく勉強できま。, とっつきやすさという点で、Python 入門者向け参考書としてはナンバーワンだと思います。, だえうホームページのプライバシーポリシー・免責事項についてはこちらに記載しております。. label.pack(), あなたの場合は、画像をあなたのself変数に、あるいはキャンバスに付けることができます。 それは何かに割り当てられている限り、本当に重要ではありません。. everything on the canvas, the image and an assortment of lines and circles will be on the canvas eventually. teratailを一緒に作りたいエンジニア. ブログを報告する, tkinterではwidget(例:Frame、Canvas)を配置するには3つの方…, オプションの説明 fg bd relief cursor selectbackground 今回…. 112011-04-11 14:04:13, everything on the canvas, the image and an assortment of lines and circles will be on the canvas eventually. Just for other's benefit who find this question I'm attaching my neer final test code which uses picture in picture/magnifying glass zooming. 2, 【募集】 Pythonにて、Tkinterのバージョンが8.6以前の場合にpngの画像を表示する方法。環境が限定されている中で必要に迫られることもあるのです。 Python3.6.1 Tkinter8.5 画像を表示するには、Python標準モジュールのPILというものを使用する。今回はこの画像をWindowに表示する。 #coding:utf-8 import tkinter … If you're testing this script on linux don't forget to change the MouseWheel event to Button-4 and Button-5. pytry3gさんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?, Powered by Hatena Blog 長方形を描くにはcreate_rectangleを使います。 create_rectangle(x0, y0, x1, y1, **options) Tk canvas = Tkinter. I ran the test using a 540x375 JPEG on a Mac Pro with 32GB RAM.

Canvas上に画像や図形を描いてみる。 tkinterのCanvasには画像や図形をCanvas上に描くことが可能で、そのためのメソッドがいくつか用意されています。 長方形を描くー>create_rectangle. To my knowledge the built-in Tkinter Canvas class scale will not auto-scale images. Are you actually looking to scale the canvas or just the image? 112011-04-11 14:06:04. TkinterのCanvasを使ってみる. If you are unable to use a custom widget, you can scale the raw image and replace it on the canvas when the scale function is invoked. Tk canvas = Tkinter.

tkinterのウインドウに画像ファイルを表示します。 This uses the Linux mousewheel buttons 4 and 5 (you'll need to generalize it to work on Windows, etc). And once placed it's incredibly important that everything keeps its x,y coordinates. このプログラムを実行すると、下のようなウィンドウが立ち上がります。このプログラムをベースにCanvasの使い方について書いていきます。, 上のコードをminimal applicationのコメントアウトの部分に置き換えると、このようなウィンドウが立ち上がります。, tkinterのCanvasには画像や図形をCanvas上に描くことが可能で、そのためのメソッドがいくつか用意されています。, create_rectangle(x0, y0, x1, y1, **options), 2つの座標、左上の座標(x0, y0)と右下の座標(x1, y1)から長方形を作ります。ここで注意しなければならないことは右下の指定した座標は長方形には含まれないということです。, (例)長方形の中の色(fill)を赤色、辺の色(outline)を青色、線の太さ(width)を3にして長方形を作っています。, 画像の中心が指定した座標x, yに来るように表示されます。画像を貼るにはcreate_imageの引数のimageに画像をPhotoImageのオブジェクトにしてから渡す必要があります。, 上にある画像をsmile.pngとして下のプログラムと同じディレクトリに置いてから下のプログラムを動かしてみてください。, create_line(x0, y0, x1, y1, ..., xn, yn, **options), イメージとしては長方形の左上の頂点と右下の頂点から長方形の形にし、その長方形に収まるように円を描きます。, 座標の指定方法は円を描くときと同じです。下のプログラムでは弧の描き方をイメージしやすいように?円を描いてから弧を描いています。, (例)歩をCanvas上に表示させるプログラムです。文字の大きさや角度についての設定をしています。, create_ovalとcreate_arcを組み合わせて顔文字を描くプログラム。, 私の経験上、上で説明した方法で画像が表示されない場面として考えられるのはクラスの中で画像を貼り付ける処理をしている場合です。ここに、画像が表示されない理由がありました。.

私の知る限り、ビルトインのTkinter Canvasクラススケールは画像の自動スケールを行いません。カスタムウィジェットを使用できない場合は、スケール関数が呼び出されると、生の画像を拡大縮小してキャンバスに置き換えることができます。

Here is the memory used for different scale factors: Given the above, a more efficient solution might be to determine the size of the viewport where the image will be displayed, calculate a cropping rectangle around the center of the mouse coordinates, crop the image using the rect, then scale just the cropped portion. I just pass.

私はウィンドウに画像を表示しようとしています....十分に単純なようですか? まあ、私は大きなバグがあります! 私は1つのファイルでこの同じコードを持っています: import Tkinter root = Tkinter. Canvas (root) canvas. Pythonで、OpenCVとtkinterを使った簡易画像ビューアーを作ってみました。コードとしてはそれほど長くなく、作れました。ビューアーとして最低限の動きはしてくれると思います。最後にコードも載せています。コピペで動くと思います。目

Might be a good idea to look at the TkZinc widget instead of the simple canvas for what you are doing, it supports scaling via OpenGL.

画像が入ってるウインドウを作成します。 このサンプルの場合 表示はこのような物になります。 横幅400,縦幅266の画像ファイルを使って表示させています。 tkinterのウインドウに画像を設定する. PythonのGUIモジュールのtkinterには、画像を表示するウィジェットとしてcanvasというものがあります。このcanvasウィジェットにファイルから読み込んだ画像を表示します。 canvasウィジェットに画像を表示するには、tkinterのcreate_imageメソッドを使用します。 | 0, 回答 本編はここからとなります. 基本コピペで動くように書いていくつもりですが,Tkinterの基本についてはあまり触れませんのでご了承ください. 112011-04-11 21:35:24. resize ( size = ( 384 , … Otherwise you may need to use a 3rd party Tkinter control which performs this cropping / windowed scaling for you. 私の知る限り、ビルトインのTkinter Canvasクラススケールは画像の自動スケールを行いません。カスタムウィジェットを使用できない場合は、スケール関数が呼び出されると、生の画像を拡大縮小してキャンバスに置き換えることができます。 The application must keep a reference to the image object. © 2020 だえうホームページ All rights reserved. Are you actually looking to scale the canvas or just the image? 私はウィンドウに画像を表示しようとしています....十分に単純なようですか? まあ、私は大きなバグがあります! 私は1つのファイルでこの同じコードを持っています: import Tkinter root = Tkinter.