我正在尝试创建一个应用程序,但我陷入了一个可能微不足道但对我来说永久的问题。我希望 Entry 返回用户的输入,但前提是用户输入答案并按 Enter 键后。一阵子。我发现它在我按 Enter 之前返回了值。或者它首先返回 None,所以在下一次迭代中我得到了上一个问题的返回答案。这个想法是生成一个问题,然后用户输入我需要保留的答案,以便我可以进一步检查等等......
# Entry for entering answers within the quest_frame, within this frame I have another label for printing questions.
self.answer_entry = ttk.Entry(self.quest_frame)
self.answer_entry.pack(side=tk.LEFT,padx=10)
self.answer_entry["textvariable"] = self.answer_var
self.answer_entry.bind('<Key-Return>', self.run_level)
# the rest of the code
def run_level(self, event=None):
self.answer_entry.focus()
# user_answer = self.check_answer()
question = f"{first_num[0]} * {second_num[0]}"
print(question)
self.quest_label.config(text=question)
self.answer_entry.delete(0,tk.END)`
我陷入了某种循环,因为当我清除输入字段时,run_level()方法会重新启动,问题会再次生成,我可以再次输入答案....
我正在尝试编写一个程序,帮助孩子们通过游戏和竞赛学习乘法。我写了上面的部分,但我被卡住了,因为我希望仅当用户按 Enter 时才将用户的输入转发给我。为此,我使用了 Entry 中的事件。
self.answer_entry.bind('<Key-Return>', self.run_level)
我尝试将值保存在作为类的属性的变量中。
self.answer_var = tk.StringVar()
最终,经过一番劝说,我在run_level方法中得到了用户输入的命令。但我有一个问题,我陷入困境,一切都在无休止地重复。第一次提出这个问题时 self.answer_var 返回“None”给我,然后在下一个问题上返回上一个问题的答案。
由于没有完整的代码,所以评论起来有点困难。我从你的可用代码中假设的是:
我尝试以另一种方式帮助你。
我为我女儿创建了一个提问者项目来修改已知角度的 sin、cos、tan 值。我刚刚根据您的要求修改了它并发布在这里。(对于从 2 到 12 的乘法表)
主窗口只有一个“开始会话”按钮。如果按下按钮,则会出现一个弹出窗口。弹出窗口会一一询问10个问题。每个正确答案给 10 分。相同的按钮用于提交和提出下一个问题。但是,按钮中的文本将相应地更改“提交”或“下一个问题”。提交后,文本输入小部件消失。对于每个问题,都会显示分数。如果输入为空或者如果您输入str而不是数字,它会给您错误文本并等待正确的输入。完成所有10个问题后,它会给您一个最终分数,同一个按钮会询问您是否询问另一场会议。在整个会话期间,主窗口中的开始按钮将被禁用。会话结束后,此功能将重新启用。
事实上,我打出上面这段话是因为我无法添加评论。或者我必须再次检查整个代码。
修改后,我检查了一下,运行正常。请一一追踪函数。除了样式部分,我写的所有内容
将其更改为 OOPS 结构并不是什么大问题。当您自己尝试这样做时,您就会理解整个概念。
from tkinter import *
import random as rd
root_width, root_height = 300, 200
popup_width, popup_height = 500, 400
def end(*evnt):
global score, count
score, count = 0, -1
start_btn['state']=NORMAL
root.bind('<Return>', start)
top.destroy()
def get_ans(*evnt):
global score, count
global got_ans
global score_board
global got_ans
answer_label.delete(0, END)
answer_label['state']=DISABLED
question_label.configure(text='')
if count != 10:
ans_btn.configure(text='Next Question', command=mult)
top.bind('<Return>', mult)
if prod == got_ans:
score = score + 10
score_board.configure(text=f'''Good! You are correct!
Your Presenr Score is {score}/100''')
else:
ans_btn.configure(text='Next Question', command=mult)
score_board.configure(text=f'''Sorry! the answer is {prod}.
Your Score is {score}/100''')
else:
if got_ans == prod: score_board.configure(text=f'Very Good! \nYour Total Score is {score+10}/100')
else: score_board.configure(text=f'''Sorry! The answer is {prod}.
Your Total Score is {score}/100''')
ans_btn.unbind('<Button-1>')
ans_btn.configure(text='Start Another Session', command=end)
top.bind('<Return>', end)
def start(*ee):
global score, count
score, count = 0, -1
start_btn['state'] = DISABLED
root.bind('<Return>', lambda e:'break')
mult()
mult()
def pop_up():
global score, count
global top
global question
global prod
global count
global answer_label
global score_board
global ans_btn
global question_label
global error_label
global got_ans
top = Toplevel()
top.geometry(f'{popup_width}x{popup_height}')
top.title('Multiplication Table')
error_frame = Frame(top, width=popup_width, height=20)
error_frame.pack(side='top')
error_label = Label(error_frame, text='')
error_label.pack(side='top')
score_frm = Frame(top)
score_frm.pack(side='top')
Label(score_frm, text='Score Board').pack(side='top')
score_board = Label(score_frm, text='')
score_board.pack(side='top')
question_frm = Frame(top)
question_frm.pack(side='bottom')
ans_btn = Button(question_frm, width=15, text='')
ans_btn.pack(side='bottom')
answer_label = Entry(question_frm, text= '')
answer_label.pack(side='bottom')
question_label = Label(question_frm, text='')
question_label.pack(side='bottom')
def mult(*event):
global score, count
global prod
global first_num
global second_num
global question_label
global top
global question
global ans_btn
if count >=1 :
ans_btn.unbind('<Button-1>')
top.bind('<Return>', lambda e:'break')
score_board.configure(text=f'Your Presenr Score is {score}/100')
count = count + 1
if count==0: pop_up()
else:
lst = [x for x in range(2, 13)]
first_num = rd.choice(lst)
second_num = rd.choice(lst)
prod = first_num*second_num
answer_label.focus_set()
question = f'Q.{count} : {first_num} x {second_num}'
question_label.configure(text=question)
answer_label['state']=NORMAL
answer_label.bind('<Return>', buffer)
ans_btn.configure(text='check Answer', command = buffer)
def buffer(*e):
global score, count
global answer_label
global top
global prod
global got_ans
ans_btn.unbind('<Button-1>')
answer_label.bind('<Return>', lambda e:'break')
error_label.configure(text='')
top.focus_set()
got_ans = answer_label.get()
if got_ans.isdigit():
got_ans = int(float(got_ans))
get_ans()
else:
answer_label.focus_set()
error_label.configure(text='Your Answer shoulb be a Number', fg='red')
answer_label.bind('<Return>', buffer)
ans_btn.configure(text='check Answer', command = buffer)
root = Tk()
root.geometry(f'{root_width}x{root_height}')
root.title('Multiplication')
# A Button in main window to start the session containing 10 questions
start_btn = Button(root, text='Start Session', command=start)
start_btn.pack(side='bottom')
root.bind('<Return>', start)
root.mainloop()