Pythonのtkinterのcanvasに表示する画像を切り替える
PythonのGUI(tkinter)モジュールのcanvasウィジェットに表示する画像を、プログラムの側から切り替えてみました。
itemconfigでオプションを書き換える
tkinterのcanvasオブジェクトのitemconfigメソッドで、canvasのオプションを変更することができます。
tkinter.canvas.itemconfig(item, options)
変数 |
型 |
内容 |
---|---|---|
item |
変更するtkinterのcanvasのID。 |
|
options |
変更するオプション。 |
ちょっとわかりにくいので、コードを見てみます。
canvasを1つと、ボタンを3つ配置して、ボタンによって画像を切り替えるプログラムを作ってみます。
画像は プロ生ちゃん です。
import tkinter
import tkinter.ttk
from PIL import Image, ImageTk
class Application(tkinter.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.master.title('tkinter canvas trial')
self.pack()
self.create_widgets()
def create_widgets(self):
# ボタン
self.original_button = tkinter.ttk.Button(self, text='Original')
self.original_button.grid(row=0, column=1)
self.original_button.bind('<Button-1>', make_original)
self.gray_button = tkinter.ttk.Button(self, text='Gray Scale')
self.gray_button.grid(row=1, column=1)
self.gray_button.bind('<Button-1>', make_grayscale)
self.blackwhite_button = tkinter.ttk.Button(self, text='Black and White')
self.blackwhite_button.grid(row=2, column=1)
self.blackwhite_button.bind('<Button-1>', make_blackwhite)
# canvas
self.test_canvas = tkinter.Canvas(self, width=original_image.width, height=original_image.height)
self.test_canvas.grid(row=0, column=0, rowspan=3)
# canvasに初期画像を表示
self.test_canvas.photo = ImageTk.PhotoImage(original_image)
self.image_on_canvas = self.test_canvas.create_image(0, 0, anchor='nw', image=self.test_canvas.photo)
def make_original(event):
set_image(event, original_image)
def make_grayscale(event):
gray_image = original_image.convert('L')
set_image(event, gray_image)
def make_blackwhite(event):
THRESHOLD = 174
gray_image = original_image.convert('L')
bw_image = gray_image.point(lambda x: 0 if x < THRESHOLD else x)
set_image(event, bw_image)
def set_image(event, img):
# canvasの書き換え
app.test_canvas.photo = ImageTk.PhotoImage(img)
app.test_canvas.itemconfig(app.image_on_canvas, image=app.test_canvas.photo)
# 画像ファイル読み込み
original_image = Image.open('test_figure.png')
# アプリケーション起動
root = tkinter.Tk()
app = Application(master=root)
app.mainloop()
Applicationクラスにウィジェットの配置の定義をまとめてあります。
各ボタンウィジェットにbindされている関数が、ボタンのクリックイベントによって呼び出されます。Button-1はマウスの左クリックのイベントです。
Applicationクラスの最後に、test_canvas.create_image()というメソッドがあります。このメソッドの戻り値をimage_on_canvasという名前の変数に入れます。この変数が、itemconfigで変更するアイテムのターゲットになります。
各ボタンのイベントから呼び出される各関数は、単純に元画像を変換して、呼び出し元から来たeventオブジェクトと変換画像のオブジェクトをset_imageという関数に投げます。
set_image関数は受け取った画像オブジェクトをtkinter用に変換して、canvasのphotoプロパティにセットします。その後、itemconfigメソッドでcanvasにcanvasのphotoプロパティの中身を描画するよう指示します。
Python 3.7ですが、これで一応動作します。
実際に動かしてみるとこんな感じです。
公開日
広告
PythonでGUIカテゴリの投稿
- PythonからWindowsのクリップボードに画像をコピーする
- PythonでCanvasをリサイズできるようにしてみた
- PythonでGUIに画像を表示する
- Pythonでクリップボードとのデータのやりとりをする
- Pythonでグラフ(Matplotlib)を表示して動的に変更する
- Pythonでディレクトリを選択するダイアログを使う
- Pythonでファイルを開くダイアログを使う
- Pythonで名前を付けて保存するダイアログを使う
- PythonのGUIを試してみた
- Pythonのcanvasにマウスで線を描いてみる
- Pythonのcanvasに表示した四角形を変形する
- Pythonのcanvasのマウスポインタの座標を取得する
- Pythonのtkinterのcanvasにクリップボードから画像をペーストする
- Pythonのtkinterのcanvasに表示する画像を切り替える