Python Tkinter Entry 返回值

问题描述 投票:0回答:1

我正在尝试创建一个应用程序,但我陷入了一个可能微不足道但对我来说永久的问题。我希望 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”给我,然后在下一个问题上返回上一个问题的答案。

python tkinter return-value infinite-loop
1个回答
0
投票

由于没有完整的代码,所以评论起来有点困难。我从你的可用代码中假设的是:

  1. 我不确定 ' 是否是绑定函数的有效参数。一般来说我只使用 ''。
  2. 正如评论中所述,可能存在一些缩进问题

我尝试以另一种方式帮助你。

我为我女儿创建了一个提问者项目来修改已知角度的 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()
© www.soinside.com 2019 - 2024. All rights reserved.