前提・実現したいこと
クイズゲームを作成しています。
取り込んだcsvの要素をランダムに選び、同じ要素を答えさせるゲームはいったん完成したため
新たにランダムに植物の画像を表示し、その植物の名前を当てるゲームを考えています。
※csvは以下のようなイメージです。
[{'name': 'ススキ', 'family': 'イネ科', '画像': 'ine.jpg'},
{'name': 'コムギ', 'family': 'イネ科', '画像': 'komugi.jpg'},…
ラベルに画像を表示させる(まだ固定ファイル名)ことはなんとかできたのですが、
1.その画像をリサイズする処理がうまくいきません。
リサイズ処理のみ動かした場合、うまくいったプログラムを移植したのですが・・・
2.画像をランダムに選択するため、画像読み込みの部分を関数init_view(tki)内に入れたいのですが
テスト的に固定ファイル名を指定した状態でも、まともに表示できません。
特に2に関してはラベルの理解が甘いのだと思うのですが、調べてはみたものの
ラベルの扱いも画像表示の手法も人によってさまざまで、前に進まなくなってきました。
発生している問題・エラーメッセージ
1.について _tkinter.TclError: image specification must contain an odd number of elements
該当のソースコード
python3.8.0
1import random 2import csv 3import tkinter, tkinter.messagebox 4from tkinter import * 5from tkinter import ttk 6 7tki = None 8rdo = None 9b_options = None 10rdo_var = None 11answer = None 12 13def init_view(tki): 14 global rdo, b_options, rdo_var, answer 15 16 # 上記DictReaderで読み込んだ辞書リストから、問題用に、ひとつの辞書を呼び出す 17 p_plant = random.choice(rows) 18 print(p_plant) 19 p_name = p_plant["name"] 20 21 # 問題用の植物と同じ科(family)の植物をリストにして、 22 # その中から問題用の植物を削除。 23 # 残りからひとつを選ぶ(=その植物が答えになる) 24 25 q_list = [] 26 while len(q_list) < 2: 27 q_list = [x['name'] for x in rows if x['family'] == p_plant["family"]] 28 q_list.remove(p_plant["name"]) 29 answer = random.choice(q_list) 30 31 # 答えとは異なる科(family)の植物をリスト化し、そこから3つ選ぶ 32 b_list = [x['name'] for x in rows if x['family'] != p_plant["family"]] 33 b_options = random.sample(b_list , 3) 34 b_options.append(str(answer)) 35 random.shuffle(b_options) 36 37 # 配置済みの子ウィジェットが存在すれば、削除しておく 38 children = tki.winfo_children() 39 for child in children: 40 # print("type of widget is : " + str(type(child))) 41 if str(type(child)) == "<class 'tkinter.Radiobutton'>": 42 child.destroy() 43 elif str(type(child)) == "<class 'tkinter.Button'>": 44 child.destroy() 45 elif str(type(child)) == "<class 'tkinter.Label'>": 46 child.destroy() 47 48 # ラジオボタンのラベルをリスト化する 49 # rdo_txt = random.sample(b_options , k=4) 50 # ラジオボタンの状態 51 rdo_var = tkinter.IntVar() 52 53 # ラジオボタンを動的に作成して配置 54 for i in range(4): 55 rdo = tkinter.Radiobutton(tki, value=i, variable=rdo_var, text=b_options[i]) 56 rdo.place(x=50, y=80 + (i * 24)) 57 58 # ボタン作成 59 btn = tkinter.Button(tki, text='答え合わせ', command=btn_click) 60 btn.place(x=100, y=270) 61 62 63# 以前画像を使わない4択問題で使っていたコード 64# var = tkinter.StringVar() 65# var.set(p_name + "と同じ科の植物はどれでしょう") 66# label = tkinter.Label(tki, image=icon,textvariable=var, compound="top",width=100, ) 67# label.pack() 68 69# ボタンクリックイベント 70def btn_click(): 71 num = rdo_var.get() 72 73 if b_options[num] == str(answer): 74 tkinter.messagebox.showinfo('結果' , "正解!") 75 else: 76 tkinter.messagebox.showinfo("結果" , '不正解!正解は' + answer) 77 78 # 表示内容の再初期化 79 init_view(tki) 80 81with open('plant.csv', newline='') as csvfile: 82 reader = csv.DictReader(csvfile) 83 rows = [] 84 for row in reader: 85 rows.append(row) 86 87root = Tk() 88root.geometry('300x400') 89root.title('ラジオボタン') 90frame1 = ttk.Frame(root) 91frame1.grid() 92 93# ここが困っている部分です 94icon = PhotoImage(file="aburana_f.gif") 95label1 = ttk.Label(frame1 , image=icon , text="てきすと", compound="top") 96label1.grid(row=1,column=1) 97 98root.mainloop() 99 100
試したこと
1.について
img = Image.open("daikon_f.jpg") # イメージを開く
resize_image = img.resize((200, int(200 * img.size[1] / img.size[0]))) # 画像のリサイズ
2.について
icon = PhotoImage(file="aburana_f.gif")
label1 = ttk.Label(frame1 , image=icon , text="てきすと", compound="top")
label1.grid(row=1,column=1)
を
ボタン作成の下に入れ、多少いじりましたが、ウィンドウは出るものの、画像もボタンも何も表示されません。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/28 07:51 編集
退会済みユーザー
2020/01/28 14:56
2020/01/28 17:28
2020/01/28 19:17
退会済みユーザー
2020/01/29 14:49