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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

受付中

Pythonで製作中の「英単語四択問題アプリ」をクラスで書き換えたい

kumasan2019
kumasan2019

総合スコア12

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0回答

0評価

0クリップ

159閲覧

投稿2022/05/21 01:56

編集2022/05/21 05:55

前提

Pythonで「英単語四択問題アプリ」を作ってますが、下記諸問題があり行き詰っております。

解決案の示唆でも結構ですので宜しくお願い致します。

実現したいこと

下記問題点を解決したい:
・正解の選択肢の位置をバラバラにしたい(現在は常にラジオボタン①になってしまう)
・nextボタンで次の問題を出せるようにしたい。---> クラス仕様が良いのかもしれません。
・次の問題・選択肢を表示させると、前の表示が長い場合に残滓がでる(deleteなどでも消せない)
・現在の成績を出したい(出題数と正解数が分かればよい)
・最終的には今後の応用を考えclassで書き直したい

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

・正解の選択肢の位置をバラバラにしたい。
・nextボタンで次の問題を出せるようにしたい。
・次の問題・選択肢を表示させると、前の表示が長い場合に残滓がでる
・現在の成績を出したい(出題数と正解数が分かればよい)
・最終的には今後の応用を考えclassで書き直したい

エラーメッセージ

現在の処理方法ではエラーはありません。

該当のソースコード

import csv
import random
import tkinter as tk
import datetime

root=tk.Tk()
root.title("英単語四択Q&A")
root.geometry("380x400")

now = datetime.datetime.now()
day = now.date().strftime('%m/%d/%Y')
lbl_1=tk.Label(text=day)
lbl_1.place(x=300,y=10)

lbl_2=tk.Label(text="英単語問題:")
lbl_2.place(x=10,y=40)
lbl_3=tk.Label(text="正誤判定:")
lbl_3.place(x=10,y=230)

lbl_4=tk.Label(text="備考:")
lbl_4.place(x=10,y=260)
lbl_5=tk.Label(text="現在の成績:")
lbl_5.place(x=10,y=290)

frame_1=tk.LabelFrame(root,text="選択肢", width=350, height=150)
frame_1.place(x=15, y=70)

lbl_11=tk.Label(text=" ver 1.1")
lbl_11.place(x=320,y=350)

txt_1=tk.Entry(width=40) # 英単語問題表示
txt_1.place(x=90,y=40)

txt_2=tk.Entry(width=47) # 正誤判定表示
txt_2.place(x=75,y=230)

txt_3=tk.Entry(width=51) # 備考 未完
txt_3.insert(tk.END, " 検討中")
txt_3.place(x=50,y=260)

txt_4=tk.Entry(width=45) # 現在の成績 未完
txt_4.insert(tk.END, " 検討中")
txt_4.place(x=87,y=290)

selected_elements = [] #全データ用入れ物

path = '英単語試験100ver3.csv'
with open(path) as f:
reader = csv.reader(f)
for selected_elements in reader:
selected_elements.append(selected_elements)

問題集ファイル(csv)の読み込み。1行目はヘッダなので読み込まない。

path = '英単語試験100ver3.csv'
test_file = open(path)
test_data = csv.reader(test_file)
all_elements = [] #全データ用入れ物

for row in test_data: # test_dataをrowに入れる
if test_data.line_num == 1: #タイトル行は読まずに続ける
continue
all_elements .append(row) #入れ物に全データを収納する
test_file.close() # 100行を読み込むとcloseされる
#print("all_elements : ", all_elements )#リストの中身は、100個の小リストが格納されている

selected_elements = random.sample(all_elements, 5) # 5個の英単語群が得られる
#print("選択された単語番号,英単語,意味の小リスト: ", selected_elements[0]) # ['42', 'gaunt\u3000', 'やせた']
#print("単語番号: ", selected_elements[0][0]) # 42 - この数字を合否判定に使う
#print("英単語: ", selected_elements[0][1]) # gaunt
txt_1.delete(0, tk.END)
txt_1.insert(tk.END, ' ' + selected_elements[0][1]) # 質問用英単語表示
#print(txt_1.get())#確認のためtxt_1の表示文字を確認する #gaunt OK

var = tk.IntVar()#int の値を保持するオブジェクトを作成。 IntVar は Variable クラスのサブクラス。
var.set(5) # ダミー(他の選択肢が非選択となるようにする)
var.get()

selected_radio = random.sample(range(1,6), k=5)#乱数で以下の様な、五個(k)のデータリストの順番用数字をgetする
#print("要素五個のリスト: ", selected_radio)#[1, 5, 3, 4, 2] 選択肢の順序を乱数で並び変えるには??
txt_1.delete(0, tk.END)
txt_1.insert(tk.END, ' ' + selected_elements[0][1]) #英単語表示

#ラジオボタンの動的配置 どのボタンも選択されていない(枠外のvar.set(5)に設定してあるため)
for i in range(5):
radiobutton = tk.Radiobutton(frame_1, value=i, variable=var, text=selected_elements[i][2]).place(x=0, y=i*25)

def evaluate():
num = var.get()#押されたラジオボタンの番号を格納する
txt_2.delete(0, tk.END)
print("radioBuon No. :", num)#押されたラジオボタンの番号を表示する
if num == 0:#最初のラジオボタンが押された場合
txt_2.insert(tk.END, ' 正解: ' + selected_elements[num][2])
else:#最初のラジオボタン以外が押された場合
txt_2.insert(tk.END, ' 残念、不正解です、もう一度頑張ってね。' )

def next():
var.set(5)
txt_1.delete(0, tk.END)
txt_2.delete(0, tk.END)
pass # 最初に戻る処理を考慮中

btn_1=tk.Button(root, text="評価", command=evaluate)
btn_1.place(x=80, y=350)

btn_2=tk.Button(root, text="次へ", command=next)
btn_2.place(x=150, y=350)

btn_3=tk.Button(root, text="終わり", command=root.destroy)
btn_3.place(x=220, y=350)

root.mainloop()

Python 3.10.4

windows10

試したこと

・正解の選択肢の位置をバラバラにしたい:
radiobuttonへの書き込み(text)をshuffleしても、正解肢が必ず最初のラジオボタンになります。
・次の問題・選択肢を表示させると、前の表示が長い場合に残滓がでる:
delete、destroyなどで試しましたが上手くいきませんでした
・成績評価やクラス移行は未検討です。

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

editorはPython付属のIDLEですイメージ説明

ここにより詳細な情報を記載してください。

このアプリで使用している英単語fileをテンプします。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

qnoir

2022/05/21 02:28 編集

質問文に書いてあるソースコードにインデントがない為、確認ができません。 ソースは ``` と ``` の間に記入してください。 あと、タイトルは「英単語四択問題アプリ」となっていますが、画像やコードから推測するに「5つの選択肢から1つ正解を選ぶ問題」のようです。 要件としては、4択ではなく「5択」であるという理解でよろしいでしょうか。・
meg_

2022/05/21 02:51

コードは「コードの挿入」で記入してください。
kumasan2019

2022/05/21 04:44

1.「コードの挿入」にcodeを入れると「自己解決」とされてしまいます。 どこでcodeの修正ができるのかわかりません。 お手数おかけします。 2.ラヂオボタンが5個あるので、五択と思われますが最後のラジオボタンはダミーとして使ってます。   正しい方法ではないと思いますが、選択前や次へボタンを押したときに、4択のボタンを非選択とするためです。 

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。