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

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

ただいまの
回答率

88.64%

Pythonで子供向けアプリを作ってます。初動は上手く行くのですが、「Next」で次への処理の仕方が分かりません。 前の質問がまずかったので再度修正してアップ致しました

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 232

kumasan2018

score 19

前提・実現したいこと

Pythonで子供向けのアプリを作っております。
立ち上げ画面まではいいのですが、次への処理が分かりません。

宜しくお願い致します。

発生している問題・エラーメッセージ

Nextボタンの処理方法が分かりません。
listboxの正しい要素をselectすると表示するようになっているのですが、
その辺がNextクリックでうまく行きません

該当のソースコード

import os
import tkinter as tk
import random
from PIL import Image, ImageTk

root = tk.Tk()
root.title("笑和のディズニーランド")
root.geometry("580x500")

label_asking_name = tk.Label(root, text="これは誰でしょう?", bg="lightblue")
label_asking_name.place(x=20, y=20)

label2_jpg_img = tk.Label(root)
label2_jpg_img.place(x=20, y=50)

label3_showing_name = tk.Label(root, text="正解なら")
label3_showing_name.place(x=380, y=380)
label4 = tk.Label(root, text="キャラクターの名前がここに出ます")
label4.place(x=400, y=400)

textbox_story = tk.Text(root, font=("Menlo", 12, "bold"),
                        bg='lightyellow', width=35, height=6)
textbox_story.place(x=20, y=350)

stars = {
    'おーろらひめ': '悪い魔女に呪いをかけられ生きたまま眠り続けることになりますが、王子によって助け出され、幸せになります。',
    'ありえる': '陸に憧れていた人魚姫が、海の魔女に人間にしてもらいます。魔女は人魚たちの王国を乗っ取るつもりでしたが、エリック王子によって倒され、最後に姫と王子は結ばれます。',
    'あな': '生まれつき氷の魔力を持った姉・エルサは、能力を暴発させた罪の意識から行方をくらませてしまう。妹・アナの頑張りによりエルサの心は救われ、自分らしく生きることの喜びを知る。',
    'えるさ': '生まれつき氷の魔力を持った姉・エルサは、能力を暴発させた罪の意識から行方をくらませてしまう。妹・アナの頑張りによりエルサの心は救われ、自分らしく生きることの喜びを知る。',
}

lable_name = tk.Label(root, font=("Menlo", 12, "bold"),
                      width=15, fg="red", bg="lightblue")
lable_name.place(x=380, y=420)

def show_item(event):
    item_index = listbox_JIS.curselection()  # sellected listbox item

    if len(item_index) >= 1:
        selected_name = dizney[0][:-4]
        lable_name["text"] = listbox_JIS.get(item_index)

        if dizney[0][:-4] == listbox_JIS.get(item_index):
            lable_name["text"] = dizney[0][:-4]

            message = stars[dizney[0][:-4]]
            textbox_story.insert(tk.END, message)
        else:
            lable_name["text"] = ""
            textbox_story.delete("1.0", "end")

def push_next():
    lable_name['text'] = ''
    label2_jpg_img.configure(image='')
    textbox_story.delete('1.0', 'end')

path = "./holder_jpg"
dizneys = os.listdir(path)
dizney = random.sample(dizneys, 1)
# print(dizney[0])
img = Image.open('./holder_jpg/' + dizney[0])
img = ImageTk.PhotoImage(img)
label2_jpg_img = tk.Label(root, image=img)
label2_jpg_img.place(x=20, y=50)

listbox_JIS = tk.Listbox(root, font=(
    "Times New Roman", 12, "bold"), width=15, height=14, selectmode="single")
listbox_JIS.bind("<<ListboxSelect>>", show_item)

key_list = ["あな", "ありえる", "えるさ", "おーろらひめ"]
random.shuffle(key_list)

for item in key_list:
    listbox_JIS.insert(tk.END, item)
    listbox_JIS.place(x=380, y=20)

button1 = tk.Button(root, text='Next', width=5, command=push_next)
button1.place(x=400, y=330)

def destroy():
    root.destroy()

button2 = tk.Button(root, text='End', width=5, command=destroy)
button2.place(x=450, y=330)

root.mainloop()

試したこと

Nextボタンをクリックしたら、画像・ラベル文字削除までは出来たのですが、画像・リストボックス要素の取り込みが出来ません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。
開発環境はW10 x64、Visual Sutudio Codeを使用しております。

出来上がり図と必要画像を添付致します。画像はpyファイルとは別のholder_jpgに入れてあります。

イメージ説明

![イメージ説明]

イメージ説明

イメージ説明

イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • javahack

    2020/08/13 08:44

    画像の使用許可は得ていますか?
    得ていないのであれば、前の質問を含め安全な画像に差し替えるか削除してください。
    また、前の質問と同じ内容なら、新たに質問を立てるのは止めて(この質問は削除して)、前の質問を編集して質問を継続してください。

    キャンセル

  • tiitoi

    2020/08/13 10:16 編集

    Next ボタンを押したあとはどのような挙動を想定されていますか?

    キャンセル

  • kumasan2018

    2020/08/13 13:01

    この質問に目をとめて頂き有難うございます。

    まず、プログラムを起動すると;
    ・画像と複数の名前を取りこんだリストボックスが表示されます。
    ・そのリストボックスの中から正しい名前をクリックすると、その名前と説明が表示されます。

    次に「Nextボタン」をクリックすると、次のような挙動を期待しております。
    ・画像、名前を一旦消す。リストボックスの要素も消してもいいです。
    ・次にboot時と同様に、画像・リストボックス要素の順序を変えて表示します。
    ・これで初期のboot状態と同じようにしたいのです。

    def push_next():では画像・名前の消去までしか出来ておりません。 その中にboot時に行うpathやlistboxを取り込めるように同じcodeを書いてみたのですが、listbox_JIS.bind("<<ListboxSelect>>", show_item)とバッティングして上手く動作しませんでした。

    この説明でお分かりいただけたかどうか、分かりませんが宜しく度指導お願い致します。

    p.s. 添付のimgに同じものが有りますが、気にしないで下さい。

    キャンセル

回答 1

checkベストアンサー

+1

画像を設定したり、テキストボックスの中身をクリアしたりする処理を関数に全部まとめて、初回起動時や「Next」ボタンを押したときに初期化処理が実行されるように整理すればいいのではないでしょうか

import os
import tkinter as tk
import random
from PIL import Image, ImageTk

#########################################
# データ
#########################################
stars = {
    "おーろらひめ": "悪い魔女に呪いをかけられ生きたまま眠り続けることになりますが、王子によって助け出され、幸せになります。",
    "ありえる": "陸に憧れていた人魚姫が、海の魔女に人間にしてもらいます。魔女は人魚たちの王国を乗っ取るつもりでしたが、エリック王子によって倒され、最後に姫と王子は結ばれます。",
    "あな": "生まれつき氷の魔力を持った姉・エルサは、能力を暴発させた罪の意識から行方をくらませてしまう。妹・アナの頑張りによりエルサの心は救われ、自分らしく生きることの喜びを知る。",
    "えるさ": "生まれつき氷の魔力を持った姉・エルサは、能力を暴発させた罪の意識から行方をくらませてしまう。妹・アナの頑張りによりエルサの心は救われ、自分らしく生きることの喜びを知る。",
}

#########################################
# コールバック関数
#########################################
def show_item(event):
    item_index = listbox_JIS.curselection()  # sellected listbox item

    if len(item_index) >= 1:
        # 選択した名前を取得
        select_name = listbox_JIS.get(item_index)

        if correct_name == select_name:
            # 正解した場合
            lable_name["text"] = select_name
            textbox_story.insert(tk.END, stars[select_name])
        else:
            # 不正解の場合
            lable_name["text"] = ""
            textbox_story.delete("1.0", "end")


def initialize():
    global correct_name
    # 正解の名前を初期化
    lable_name["text"] = ""
    # 名前一覧を初期化
    listbox_JIS.delete(0, tk.END)
    for name in stars.keys():
        listbox_JIS.insert(tk.END, name)
    # 正解の説明を初期化
    textbox_story.delete("1.0", tk.END)

    # ランダムに画像のパスを選択
    img_path = random.choice(dizneys)
    correct_name = img_path.split(".")[0]

    # 画像ファイルを設定
    img = Image.open("./holder_jpg/" + img_path)
    img = ImageTk.PhotoImage(img)
    label2_jpg_img.configure(image=img)
    label2_jpg_img.image = img


def push_next():
    initialize()


def destroy():
    root.destroy()


#########################################
# GUI の設定
#########################################
root = tk.Tk()
root.title("笑和のディズニーランド")
root.geometry("580x500")

label_asking_name = tk.Label(root, text="これは誰でしょう?", bg="lightblue")
label_asking_name.place(x=20, y=20)

label2_jpg_img = tk.Label(root)
label2_jpg_img.place(x=20, y=50)

label3_showing_name = tk.Label(root, text="正解なら")
label3_showing_name.place(x=380, y=380)
label4 = tk.Label(root, text="キャラクターの名前がここに出ます")
label4.place(x=400, y=400)

textbox_story = tk.Text(
    root, font=("Menlo", 12, "bold"), bg="lightyellow", width=35, height=6
)
textbox_story.place(x=20, y=350)

button1 = tk.Button(root, text="Next", width=5, command=push_next)
button1.place(x=400, y=330)

button2 = tk.Button(root, text="End", width=5, command=destroy)
button2.place(x=450, y=330)

lable_name = tk.Label(
    root, font=("Menlo", 12, "bold"), width=15, fg="red", bg="lightblue"
)
lable_name.place(x=380, y=420)

listbox_JIS = tk.Listbox(
    root, font=("Times New Roman", 12, "bold"), width=15, height=14, selectmode="single"
)
listbox_JIS.bind("<<ListboxSelect>>", show_item)
listbox_JIS.place(x=380, y=20)

#########################################
# main
#########################################
path = "./holder_jpg"
dizneys = os.listdir(path)
correct_name = ""

initialize()
root.mainloop()

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/08/13 15:32

    Tiitoiさん

    完璧に期待通りの動作をしております。

    80歳過ぎからの独学ですので、今後の応用にも有益なcodeにして頂きました。

    重ねてお礼申し上げます。

    キャンセル

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

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

関連した質問

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

  • トップ
  • Pythonに関する質問
  • Pythonで子供向けアプリを作ってます。初動は上手く行くのですが、「Next」で次への処理の仕方が分かりません。 前の質問がまずかったので再度修正してアップ致しました