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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

684閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/08/12 23:06

編集2020/08/13 00:32

前提・実現したいこと

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

宜しくお願い致します。

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

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

該当のソースコード

Python3.7.3

1import os 2import tkinter as tk 3import random 4from PIL import Image, ImageTk 5 6root = tk.Tk() 7root.title("笑和のディズニーランド") 8root.geometry("580x500") 9 10label_asking_name = tk.Label(root, text="これは誰でしょう?", bg="lightblue") 11label_asking_name.place(x=20, y=20) 12 13label2_jpg_img = tk.Label(root) 14label2_jpg_img.place(x=20, y=50) 15 16label3_showing_name = tk.Label(root, text="正解なら") 17label3_showing_name.place(x=380, y=380) 18label4 = tk.Label(root, text="キャラクターの名前がここに出ます") 19label4.place(x=400, y=400) 20 21textbox_story = tk.Text(root, font=("Menlo", 12, "bold"), 22 bg='lightyellow', width=35, height=6) 23textbox_story.place(x=20, y=350) 24 25stars = { 26 'おーろらひめ': '悪い魔女に呪いをかけられ生きたまま眠り続けることになりますが、王子によって助け出され、幸せになります。', 27 'ありえる': '陸に憧れていた人魚姫が、海の魔女に人間にしてもらいます。魔女は人魚たちの王国を乗っ取るつもりでしたが、エリック王子によって倒され、最後に姫と王子は結ばれます。', 28 'あな': '生まれつき氷の魔力を持った姉・エルサは、能力を暴発させた罪の意識から行方をくらませてしまう。妹・アナの頑張りによりエルサの心は救われ、自分らしく生きることの喜びを知る。', 29 'えるさ': '生まれつき氷の魔力を持った姉・エルサは、能力を暴発させた罪の意識から行方をくらませてしまう。妹・アナの頑張りによりエルサの心は救われ、自分らしく生きることの喜びを知る。', 30} 31 32lable_name = tk.Label(root, font=("Menlo", 12, "bold"), 33 width=15, fg="red", bg="lightblue") 34lable_name.place(x=380, y=420) 35 36def show_item(event): 37 item_index = listbox_JIS.curselection() # sellected listbox item 38 39 if len(item_index) >= 1: 40 selected_name = dizney[0][:-4] 41 lable_name["text"] = listbox_JIS.get(item_index) 42 43 if dizney[0][:-4] == listbox_JIS.get(item_index): 44 lable_name["text"] = dizney[0][:-4] 45 46 message = stars[dizney[0][:-4]] 47 textbox_story.insert(tk.END, message) 48 else: 49 lable_name["text"] = "" 50 textbox_story.delete("1.0", "end") 51 52def push_next(): 53 lable_name['text'] = '' 54 label2_jpg_img.configure(image='') 55 textbox_story.delete('1.0', 'end') 56 57path = "./holder_jpg" 58dizneys = os.listdir(path) 59dizney = random.sample(dizneys, 1) 60# print(dizney[0]) 61img = Image.open('./holder_jpg/' + dizney[0]) 62img = ImageTk.PhotoImage(img) 63label2_jpg_img = tk.Label(root, image=img) 64label2_jpg_img.place(x=20, y=50) 65 66listbox_JIS = tk.Listbox(root, font=( 67 "Times New Roman", 12, "bold"), width=15, height=14, selectmode="single") 68listbox_JIS.bind("<<ListboxSelect>>", show_item) 69 70key_list = ["あな", "ありえる", "えるさ", "おーろらひめ"] 71random.shuffle(key_list) 72 73for item in key_list: 74 listbox_JIS.insert(tk.END, item) 75 listbox_JIS.place(x=380, y=20) 76 77button1 = tk.Button(root, text='Next', width=5, command=push_next) 78button1.place(x=400, y=330) 79 80def destroy(): 81 root.destroy() 82 83button2 = tk.Button(root, text='End', width=5, command=destroy) 84button2.place(x=450, y=330) 85 86root.mainloop()

試したこと

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

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

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

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

イメージ説明

![イメージ説明]

イメージ説明

イメージ説明

イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

javahack

2020/08/12 23:44

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

2020/08/13 01:17 編集

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

退会済みユーザー

2020/08/13 04:01

この質問に目をとめて頂き有難うございます。 まず、プログラムを起動すると; ・画像と複数の名前を取りこんだリストボックスが表示されます。 ・そのリストボックスの中から正しい名前をクリックすると、その名前と説明が表示されます。 次に「Nextボタン」をクリックすると、次のような挙動を期待しております。 ・画像、名前を一旦消す。リストボックスの要素も消してもいいです。 ・次にboot時と同様に、画像・リストボックス要素の順序を変えて表示します。 ・これで初期のboot状態と同じようにしたいのです。 def push_next():では画像・名前の消去までしか出来ておりません。 その中にboot時に行うpathやlistboxを取り込めるように同じcodeを書いてみたのですが、listbox_JIS.bind("<<ListboxSelect>>", show_item)とバッティングして上手く動作しませんでした。 この説明でお分かりいただけたかどうか、分かりませんが宜しく度指導お願い致します。 p.s. 添付のimgに同じものが有りますが、気にしないで下さい。
guest

回答1

0

ベストアンサー

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

python

1import os 2import tkinter as tk 3import random 4from PIL import Image, ImageTk 5 6######################################### 7# データ 8######################################### 9stars = { 10 "おーろらひめ": "悪い魔女に呪いをかけられ生きたまま眠り続けることになりますが、王子によって助け出され、幸せになります。", 11 "ありえる": "陸に憧れていた人魚姫が、海の魔女に人間にしてもらいます。魔女は人魚たちの王国を乗っ取るつもりでしたが、エリック王子によって倒され、最後に姫と王子は結ばれます。", 12 "あな": "生まれつき氷の魔力を持った姉・エルサは、能力を暴発させた罪の意識から行方をくらませてしまう。妹・アナの頑張りによりエルサの心は救われ、自分らしく生きることの喜びを知る。", 13 "えるさ": "生まれつき氷の魔力を持った姉・エルサは、能力を暴発させた罪の意識から行方をくらませてしまう。妹・アナの頑張りによりエルサの心は救われ、自分らしく生きることの喜びを知る。", 14} 15 16######################################### 17# コールバック関数 18######################################### 19def show_item(event): 20 item_index = listbox_JIS.curselection() # sellected listbox item 21 22 if len(item_index) >= 1: 23 # 選択した名前を取得 24 select_name = listbox_JIS.get(item_index) 25 26 if correct_name == select_name: 27 # 正解した場合 28 lable_name["text"] = select_name 29 textbox_story.insert(tk.END, stars[select_name]) 30 else: 31 # 不正解の場合 32 lable_name["text"] = "" 33 textbox_story.delete("1.0", "end") 34 35 36def initialize(): 37 global correct_name 38 # 正解の名前を初期化 39 lable_name["text"] = "" 40 # 名前一覧を初期化 41 listbox_JIS.delete(0, tk.END) 42 for name in stars.keys(): 43 listbox_JIS.insert(tk.END, name) 44 # 正解の説明を初期化 45 textbox_story.delete("1.0", tk.END) 46 47 # ランダムに画像のパスを選択 48 img_path = random.choice(dizneys) 49 correct_name = img_path.split(".")[0] 50 51 # 画像ファイルを設定 52 img = Image.open("./holder_jpg/" + img_path) 53 img = ImageTk.PhotoImage(img) 54 label2_jpg_img.configure(image=img) 55 label2_jpg_img.image = img 56 57 58def push_next(): 59 initialize() 60 61 62def destroy(): 63 root.destroy() 64 65 66######################################### 67# GUI の設定 68######################################### 69root = tk.Tk() 70root.title("笑和のディズニーランド") 71root.geometry("580x500") 72 73label_asking_name = tk.Label(root, text="これは誰でしょう?", bg="lightblue") 74label_asking_name.place(x=20, y=20) 75 76label2_jpg_img = tk.Label(root) 77label2_jpg_img.place(x=20, y=50) 78 79label3_showing_name = tk.Label(root, text="正解なら") 80label3_showing_name.place(x=380, y=380) 81label4 = tk.Label(root, text="キャラクターの名前がここに出ます") 82label4.place(x=400, y=400) 83 84textbox_story = tk.Text( 85 root, font=("Menlo", 12, "bold"), bg="lightyellow", width=35, height=6 86) 87textbox_story.place(x=20, y=350) 88 89button1 = tk.Button(root, text="Next", width=5, command=push_next) 90button1.place(x=400, y=330) 91 92button2 = tk.Button(root, text="End", width=5, command=destroy) 93button2.place(x=450, y=330) 94 95lable_name = tk.Label( 96 root, font=("Menlo", 12, "bold"), width=15, fg="red", bg="lightblue" 97) 98lable_name.place(x=380, y=420) 99 100listbox_JIS = tk.Listbox( 101 root, font=("Times New Roman", 12, "bold"), width=15, height=14, selectmode="single" 102) 103listbox_JIS.bind("<<ListboxSelect>>", show_item) 104listbox_JIS.place(x=380, y=20) 105 106######################################### 107# main 108######################################### 109path = "./holder_jpg" 110dizneys = os.listdir(path) 111correct_name = "" 112 113initialize() 114root.mainloop() 115

投稿2020/08/13 05:58

編集2020/08/13 06:02
tiitoi

総合スコア21954

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/08/13 06:32

Tiitoiさん 完璧に期待通りの動作をしております。 80歳過ぎからの独学ですので、今後の応用にも有益なcodeにして頂きました。 重ねてお礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問