前提・やりたいこと
Python tkinter を用いて、
- ランダムに画像と質問を表示する(画像表示は今回のコードでは割愛)
- 4つの選択肢から回答を選んでもらう
- 回答に基づいて処理をする(内容は割愛、末尾のコードではそのままprintさせています)
- 次の質問と画像を表示する
終了する
のボタンを押すまで処理を続ける
というプログラムを作っています。
各々のボタンを行き来するためにはTab
とShift + Tab
で行いますが、
上下キーで選択肢を移動させ、エンターキーで確定させたいため、
キーを押下したときにPyautogui
で操作するイベントを設定しています。
実現させたい挙動
上下キーで選択し、Enterキーで確定したあと
次の質問と画像が表示されたときに
直前に選んでいた選択肢の状態のままにさせたいのですが、
python
1def question_set_close(): 2 f.destroy()
上記の関数でフレームを消していることが原因か、
そう思う
~思わない
のいずれかのボタンを押した時点で選択状態が解除されてしまいます。
しかし、フレームを消さない場合、画像と質問が下にどんどん連なってしまいます。
質問
上記の通り、選択状態を維持したままにすることはできるでしょうか?
みなさまの知識をお借り出来ればと思います。
コード(全体)
python
1 2#!python3.7 3 4# 標準ライブラリ 5import random 6 7# インポートライブラリ 8import pyautogui 9import tkinter as tk 10import tkinter.font as tkFont 11from tkinter import messagebox as msgbox 12 13 14pictag = "" 15alist = ['そう思う','やや思う','あまり思わない','思わない'] 16tag_prop = '' 17 18question = ['A','B','C','D','E','F','G','H','I','J','K'] 19 20 21class TypeButton(tk.Button): 22 def __init__(self, master, label, qtype, color_code): 23 tk.Button.__init__(self, master, text=qtype, bg=color_code, command=self.btn_click) 24 self.label = label 25 self.qtype = qtype 26 self.color_code = color_code 27 28 def btn_click(self): 29 global tag_prop 30 tag_prop = self.qtype 31 if self.qtype == '違う質問を選ぶ': 32 changeText() 33 elif self.qtype == '終了する': 34 question_set_close() 35 global exitflg 36 exitflg = True 37 else: 38 print(tag_prop) 39 question_set_close() 40 41 42class Frame(tk.Frame): 43 def __init__(self, master=None): 44 global pictag 45 global question 46 47 tk.Frame.__init__(self, master) 48 self.master.title('回答してくだださい') 49 self.option_add('*font', ('FixedSys', 16)) 50 f_button = tk.Frame(self) 51 f_button.pack(side=tk.LEFT, padx=5, pady=5) 52 53 pictag = random.choice(question) 54 self.qtxt = tk.StringVar() 55 self.qtxt.set("これは {} ですか?".format(pictag)) 56 label = tk.Label(self, textvariable=self.qtxt) 57 label.configure(font=('FixedSys',30)) 58 label.pack(pady=5,side=tk.TOP ,fill=tk.X) 59 60 for name in alist: 61 b = TypeButton(f_button, label, name, '#ecffff') 62 b.pack(pady=5,fill=tk.X,side=tk.TOP) 63 another = TypeButton(f_button, label, '違う質問を選ぶ', '#d3ffc2') 64 another.pack(pady=25,fill=tk.X,side=tk.TOP) 65 buttonquit = TypeButton(f_button, label, '終了する', '#fec7ef') 66 buttonquit.pack(pady=25,fill=tk.X,side=tk.TOP) 67 68 69def changeText(): 70 global pictag 71 pictag = random.choice(question) 72 f.qtxt.set("これは {} ですか?".format(pictag)) 73 74def question_set_close(): 75 f.destroy() 76 root.quit() 77 78 79 80# 上下キーとエンターキーが押されたときの処理 81def upKey(event): 82 pyautogui.hotkey('shift', 'tab') 83 84def downKey(event): 85 pyautogui.hotkey('tab') 86 87def enterKey(event): 88 pyautogui.hotkey('space') 89 90 91if __name__ == '__main__': 92 root = tk.Tk() 93 exitflg = False 94 95 while exitflg == False: 96 f = Frame() 97 root.bind('<Up>', upKey) 98 root.bind('<Down>', downKey) 99 root.bind('<Return>', enterKey) 100 f.pack() 101 f.mainloop() 102 103 if tag_prop == '': 104 exitflg = True 105 tag_prop = '' 106 107 else: 108 root = tk.Tk() 109 root.withdraw() 110 if tag_prop == '': 111 msgbox.showinfo('終了します', 'ご協力ありがとうございました。') 112 113
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/17 02:09
2020/08/17 03:23
2020/08/17 10:45