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

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

ただいまの
回答率

88.35%

python tkinterでボタンを押すと表示された画像が別の画像に切り替わるプログラムの作成

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 6,643

python_man

score 13

tkinterを用いてGUI上でボタンと画像Aがあり、ボタンを押すと画像Aから画像Bに切り替わるようなプログラムの作成を行いたいと思っています。
tkinterを使い始めたばかりでそこまで理解ができていないのですが、ボタンがあるGUI上に画像を表示させることができないです。 
以下のコードに付け加えて教えていただけるとありがたいです。

コード
import sys
import tkinter as tk


root = tk.Tk()

# ウインドウのタイトルを定義する
root.title(u'タイトル')

# ここでウインドウサイズを定義する
root.geometry('1000x600')

# Buttonを設置してみる
Button1 = tk.Button(text=u'画像切り替え')
Button1.pack()

root.mainloop()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

ファイル名をフルパスで指定すれば動きます。
イメージ説明

参考:tkinterのlabelに貼り付けた画像を消す方法。

import sys
import tkinter
root = tkinter.Tk()

# タイトル
root.title('タイトル')

# ウインドウサイズ
root.geometry('250x250')

# 画像の取得
img1 = tkinter.PhotoImage(file = r'C:\workspace\tmp\pic\test001.png')
img2 = tkinter.PhotoImage(file = r'C:\workspace\tmp\pic\test002.png')

# 画像切替
def push1():
    label1.configure(image=img1)
    label2.configure(image='')

def push2():
    label1.configure(image='')
    label2.configure(image=img2)

# ボタン
Button1 = tkinter.Button(text = '画像1' , command = push1)
Button1.grid(row = 1, column = 0)
Button2 = tkinter.Button(text = '画像2' , command = push2)
Button2.grid(row = 1, column = 1)

# ラベル
label1 = tkinter.Label(root,image=img1)
label1.grid(row = 0, column = 0)
label2 = tkinter.Label(root)
label2.grid(row = 0, column = 0)

# ループ
root.mainloop()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/10 01:34

    回答ありがとうございました。
    とてもシンプルで分かりやすいプログラムでいした!

    キャンセル

-4

試してみた。なかなか面白いですね。

import tkinter as tk
from PIL import Image, ImageTk


class Frame(tk.Frame):
    img1=None
    img2=None
    def __init__(self, master=None, title=None, width=100, height=100):
        tk.Frame.__init__(self, master, height=height, width=width)
        if title is not None:
            self.master.title(title)
        def photoImage(f):
            img = Image.open(f)
            if img.mode == 'P':
                img = img.convert('RGB')
            img = img.resize((80,80))
            photo = ImageTk.PhotoImage(img)
            return photo

        # 画像の取得
        self.img1 = photoImage(r'../resource/heart_16.png')
        self.img2 = photoImage(r'../resource/map-marker_16.png')

        self.set_button()
        self.set_label()

    def set_button(self):
        # ボタン
        quit=tk.Button(self, text='quit', bg='gray', command=self.master.destroy)
        quit.grid(row=0, column=0)

        btn1 = tk.Button(self, text='画像1', command=lambda: self.push(self.img1))
        btn1.grid(row=0, column=1)
        btn2 = tk.Button(self, text='画像2', command=lambda: self.push(self.img2))
        btn2.grid(row=0, column=2)

    def set_label(self):
        # ラベル
        l1 = tk.Label(self, image=self.img1, bg="linen")
        l1.image = self.img1
        l1.grid(row=1, column=1)
        self.label1 = l1

    # 画像切替
    def push(self, img):
        self.label1.configure(image=img)

if __name__ == "__main__":

    frm = Frame(title='test', width=200, height=200)
    frm.pack()

    # ループ
    frm.mainloop()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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