Python tkinter / ラジオボタンで表示画像を変更する方法

PythonのGUI作成ライブラリ「tkinter」でGUIアプリを作成してみました。(アプリというほどのものじゃなく、単に表示画像を変更しているだけですが。。)

GUIアプリの一部のエリアで画像を表示し、ボタンによって切り替えるということを想定して作成しました。


左側のメニューエリア、右側の画像表示エリアの2つのエリアで構成。メニューエリアにあるラジオボタンの値を取得して表示する画像を決定します。

左側のラジオボタンで「ラーメン」を選択すると、予めプログラムで読み込まれたラーメンの画像が表示されます。


ラジオボタンで「うどん」を選択すると、うどんの画像が表示されます。


テキストボックスにサイズを入力すると、画像がそのサイズにリサイズされます。上の画像はサイズを200にしてみました。

画像がフレームからはみ出す場合などはこの数値を調整します。

以下がサンプルプログラムとなります。(Pythonは学習中のため無駄な記述などがある場合があることご了承ください)

また本プログラムは、他のプログラムからの転用のため画像はOpenCVで読み込んでますが、他の方式で読み込んだ方がシンプルに記述できると思います。

サンプルプログラム

#ライブラリのインポート
import tkinter as tk
import tkinter.filedialog
import cv2
from PIL import Image, ImageTk

#フォーマット変換の関数
#BGR→RGB→PIL→tkフォーマットへ変換
def format(image_bgr):
    image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)
    image_pil = Image.fromarray(image_rgb)
    image_tk  = ImageTk.PhotoImage(image_pil)
    return image_tk

#リサイズ関数
#テキストボックスに入力されたサイズにリサイズ
def resize(img):
    size = int(en.get())
    h, w = img.shape[:2]
    cvh = size*h/w
    image_bgr = cv2.resize(img, (size,int(cvh)))
    return image_bgr

#ラジオボタン関数
def radio():
    global image_tk
    rb = val_r.get()
    if rb == 1:
        image = img_ramen
    else:
        image = img_udon
    image_bgr = resize(image)
    image_tk = format(image_bgr)
    canvas.create_image(0, 0, image=image_tk, anchor=tk.NW)

#ウインドウの作成
root = tk.Tk()
#ウインドウのタイトル
root.title("tk 画像表示")
#ウインドウサイズと位置指定 幅,高さ,x座標,y座標 
root.geometry("800x520+50+50")

#フレームの作成
frame = tk.Frame(root, width=780, height=490, padx=10, pady=10, bg="#D9D9D9")
frame.place(x=10, y=10)

frame_menu = tk.Frame(frame, relief=tk.FLAT, bg="#E6E6E6", bd=2)
frame_menu.place(x=10, y=10, width=150, height=450)

frame_img = tk.Frame(frame, relief=tk.FLAT, bg="#E6E6E6", bd=2)
frame_img.place(x=170, y=10, width=580, height=450)

#テキストボックスの作成
en = tk.Entry(frame_menu)
en.insert(0, int(600))
en.place(x=10, y=80, width = 80)

#画像読み込み
img_ramen = cv2.imread("ramen.jpeg")
img_udon = cv2.imread("udon.jpeg")

# ラジオボタンチェック
val_r = tk.IntVar()
# ラジオボタン初期値
val_r.set(0)

#ラジオボタン
rdo1 = tk.Radiobutton(frame_menu, value=1, variable=val_r, text='ラーメン',command=radio)
rdo1.place(x=10, y=120)

rdo2 = tk.Radiobutton(frame_menu, value=2, variable=val_r, text='うどん',command=radio)
rdo2.place(x=10, y=150)

#Labelの生成
l = tk.Label(frame_menu,text="サイズ", relief="flat")
l.place(x=10, y=50)

#キャンバス作成・配置
canvas = tk.Canvas(frame_img, width=550, height=420)
canvas.place(x=10, y=10)

#イベントループ
root.mainloop()
タイトルとURLをコピーしました