🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

1回答

1196閲覧

Python 英単語学習アプリでaと指定したら、aで始まる単語だけを出題させたい。

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2021/03/08 05:20

前提・実現したいこと

Pythonで英単語学習アプリを作成しております。

現在は全てのtextを読み込んで、乱数で単語・意味・例文を表示できております。

しかし沢山の英単語を取り出し表示すると、たまにしか出会えない単語が多すぎて学習にならないのです。 

そこで、aならaで始まる単語だけを繰り返し学習し、次にbで始まる単語の学習をするようにしたいのです。 その為にEntryボックスにあるa~zをクリックしたら、その頭文字の英単語だけを出題するようにしたいのです。

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

上記の処理ではエラーは出ておりませんが、期待しているようにcodingが出来ません。

該当のソースコード

Python3.8

1 2import tkinter as tk 3import random 4import textwrap # 文字列折り返し用 5import time 6 7root = tk.Tk() 8 9root.geometry('480x360') 10root.title('新難解英単語') 11 12font_word = font = ("Helevetica", 12, "bold") 13 14lbl1 = tk.Label(text='英単語:', font=font_word) 15lbl1.place(x=10, y=30) 16lbl2 = tk.Label(text='意味:', font=font_word) 17lbl2.place(x=10, y=80) 18lbl3 = tk.Label(text='備考:', font=font_word) 19lbl3.place(x=10, y=130) 20lbl4 = tk.Label(root, font=font_word) # 備考表示用 21lbl4.place(x=75, y=130) 22 23txt1 = tk.Entry(width=42, font=font_word, fg="red") # 英単語 24txt1.place(x=75, y=30) 25txt2 = tk.Entry(width=42, font=("Helevetica", 12, "bold")) # 意味 26txt2.place(x=75, y=80) 27 28btn1 = tk.Button(root, width=15, text='開始/次へ', font=font_word) 29btn1.place(x=40, y=250) 30 31btn2 = tk.Button(root, text="<-- 先頭のabcで学習グループを指定") 32btn2.place(x=200, y=200) 33 34txt3 = tk.Entry(root, width=8, bg="pink") # 学習する単の開始場所(start) 35txt3.place(x=80, y=200) 36 37 38def read_words(): 39 with open("文字列読込2ab.txt", 'r', encoding='utf_8') as file: 40 line = file.readlines() 41 42 eitango_words = [] # 英単語list 43 imi_words = [] # 意味list 44 ref_words = [] 45 46 line_count = 0 # 単語数カウンター 47 48 for name in line: 49 name = name.rsplit("\t") # tabで区切ったファイルの場合 50 if len(name) == 3: # 要素3個をそれぞれのlistへ追加する 51 eitango_words.append(name[0]) # 英単語をlistへadd 52 imi_words.append(name[1]) # 意味をlistへadd 53 ref_words.append(name[2]) # 例文とかをlistへadd 54 line_count += 1 55 56 for name in line: 57 first_letter = txt3.get() 58 #print("line 61 :", first_letter) 59 if name.startswith(first_letter): 60 print("line 63: ", name) 61 pass 62 # ここからどこへ飛ばすか不明 3/7/2021 63 return line_count, [eitango_words, imi_words, ref_words] 64 65 66def show_data(count, num, eitango_words, imi_words, ref_words): 67 eitango_word = eitango_words[num] 68 imi_word = imi_words[num] 69 ref_word = ref_words[num] 70 71# ボタン1(開始/次)の関数 72 def show_tango(event): 73 txt1.delete(0, tk.END) 74 txt2.delete(0, tk.END) 75 first_letter = txt3.get() 76 lbl4["text"] = "" 77 78 num = random.randrange(0, count) 79 eitango_word = eitango_words[num] 80 txt1.insert(tk.END, eitango_word) 81 82 def meaning(event): 83 txt2.delete(0, tk.END) 84 imi_word = imi_words[num] 85 ref_word = ref_words[num] 86 txt2.insert(tk.END, eitango_word) 87 lbl4["text"] = "" 88 lbl4["text"] = ref_word 89 90 message = textwrap.wrap(ref_word, 35) 91 ref = '\n'.join(message) 92 lbl4["text"] = ref 93 btn1.bind("<ButtonRelease>", meaning) 94 95 btn1.bind("<Button>", show_tango) 96 97 98first_letter = input("Enter first letter. --> :") 99txt3.insert(tk.END, first_letter) 100count, words = read_words() 101eitango_words = words[0] 102imi_words = words[1] 103ref_words = words[2] 104num = random.randrange(0, count) 105show_data(count, num, eitango_words, imi_words, ref_words) 106 107 108def destroy(): 109 root.destroy() 110 111 112btn3 = tk.Button(root, width=15, text='終わる', 113 font=font_word, command=destroy) 114btn3.place(x=270, y=250) 115 116root.mainloop() 117 118

試したこと

code中の次の処理で一度読み込んだデータをinput()関数でaとかbを入力すると、その分類の単語だけ抽出できているようですが、その後それらを表示させることが出来ません。
for name in line:
first_letter = txt3.get()
#print("line 61 :", first_letter)
if name.startswith(first_letter):
print("line 63: ", name)

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

OS:windows10
Python ver: 3.8

なお「文字列読込2ab.txt"」は次のような単語群です。tabで区切ってます。

abscOnd 逃亡する abscond the money 金を持ち逃げする
allegory 比喩、象徴、たとえ話 The wolf is an allegory of the Pope. そのオオカミは教皇の寓意像である。
bedlam 不穏な騒ぎ、混乱、気違いざた〔差別語〕 Stay away from their bedlam. あの人達に関わるな。
behest (古)命令、依頼 at his behest 彼の命令・要請で
candid 率直な、隠し撮りの(スナップ写真) You must be more candid if you want people to believe you.
canny 用心深い canny about 《be ~》~に抜け目がない、~を見抜く
dang げっ、いやだ、不愉快、damnの弱い形 ・I don't give a dang. 少しも気にしないよ。/そんなの屁とも思わない。
decency 【名】礼儀、品の良さ、良識、慎み He wasn't religious, but he believed in common decency.
edifice 大建造物、殿堂、〔手の込んだ〕組織、体系 edifice complex 巨大な建物
educe 〔事実から〕~を仮定する,〔潜在しているものを〕引き出す ・I succeeded in educing interesting responses from the informant.
faux 人造の,模造の,偽の フランス語でfalseの意味。

イメージ説明

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

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

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

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

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

guest

回答1

0

現状のやり方を続けるなら、
方法1
指定した文字で始まる単語のインデックスのリストを作っておき、その中から出題するようにする
方法2
指定した文字で始まる単語に対応する eitango_words、imi_words、ref_words を作り直してそれを使う。

ですがどちらも筋悪です。

方法3
(単語、意味、用例)のようにタプルにするかリストにして読み込み、条件に合うものだけを取りだして使うようにするのがお勧めです。

コードは簡単ですが、全て教えてしまうと勉強にならないので、自分でやってみて分からなければまた質問してください。

わからないということなので、サンプルを書いておきます。
これを元にして、考えてください。

python

1>>> def read_words(filename): 2... with open(filename, 'r', encoding='utf_8') as file: 3... words = [line.strip().split('\t') for line in file.readlines()] 4... return words 5... 6>>> def select_word(words, letter): 7... return [word for word in words if word[0].startswith(letter)] 8... 9>>> first_letter = 'b' 10>>> all_words = read_words("文字列読込2ab.txt") 11>>> selected_words = select_word(all_words, first_letter) 12>>> print('selected_words:', selected_words) 13selected_words: [['bedlam', '不穏な騒ぎ、混乱、気違いざた〔差別語〕', 'Stay away from their bedlam. あの人達に関わるな。'], ['behest', '(古)命令、依頼', 'at his behest 彼の命令・要請で']] 14>>> print('selected_words[0]:', selected_words[0]) 15selected_words[0]: ['bedlam', '不穏な騒ぎ、混乱、気違いざた〔差別語〕', 'Stay away from their bedlam. あの人達に関わるな。'] 16>>> print('selected_words[0][0]:', selected_words[0][0]) 17selected_words[0][0]: bedlam 18>>> print('selected_words[0][1]:', selected_words[0][1]) 19selected_words[0][1]: 不穏な騒ぎ、混乱、気違いざた〔差別語〕 20>>> print('selected_words[0][2]:', selected_words[0][2]) 21selected_words[0][2]: Stay away from their bedlam. あの人達に関わるな。

投稿2021/03/08 06:24

編集2021/03/16 12:23
ppaul

総合スコア24670

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

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

退会済みユーザー

退会済みユーザー

2021/03/09 05:26

ppaul様 ヒントを頂き有難うございます。 言われたような方法3もここ数週間試行錯誤してますが、解決してません。 もう少し頑張ってみます。 有難うございました。
kumasan2019

2021/03/16 10:33

ヒントを頂き有難うございます。 言われたような方法3もここ数週間試行錯誤してますが、解決してません。 私のレベルでは解決できません。 「15分調べて分からないときは、Tertailで質問しましょう」とのキャッチフレーズにもありますので、出来れば解決方法を教えて頂ければ嬉しいです。 宜しくお願い致します。
kumasan2019

2021/03/16 23:41

このシステム良く分からず無作法失礼いたしました。 「コードくれっていうのも非推奨」と有りますが、解決法を教えて頂くときにはcodeで教えてもらうのがいけないということでしょうか? いずれにしても荒れることは希望しませんおで、本件はこれえで終了致します。 怖くて質問できなくなりました。 有難うございました。
ppaul

2021/03/17 00:05

複数アカウントは良くないと思いますが、質問は気楽にやればよいと思います。 質問内容が気に入らない人は回答しなければ良いだけですよ。
kumasan2019

2021/03/17 01:10

ppaulさん 自分で解決すべく、それこそ学習しまくっております。 確かにすぐ教えてもらうより全般的なレベルは上がりました。 傘寿過ぎてかからの独学には厳しいものが有りますが、趣味ですのでまたここで教わりながら続けたいと思います。 有難うございました。
ppaul

2021/03/17 02:49

新しいことをやるのは良いことです。 頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問