1

I try to make a little gui with tkinter to improuve mental calculation. In my program, tkinter ask 10 question and the program should wait the good or bad answer before show the next question but I don't now how to wait properly

here is my code:

class PageAdd1(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)
        self.controller = controller
        self.id = controller.id

        lblTitle = tk.Label(self, text="Mode Addition Facile")  # titre de la fenêtre
        lblTitle.pack()

        btnBack = tk.Button(self, text="Revenir à la sélection de la difficulté",
                            command=lambda: controller.up_frame("PageAdd"))
        btnBack.pack()
        global score
        global flag
        global iteration
        score=0
        flag=False
        iteration=0

        def getEntry():
            global score
            global flag
            res=int(entryRes.get())
            if res == c:
                score= score +1
                flag=True
            print(score)

        btnValid = tk.Button(self, text="Valider", command=getEntry)
        btnValid.pack()
        lblQuestion = tk.Label(self, text="initiation")
        lblQuestion.pack()

        for i in range(9):
            flag=False
            a, b, c = addition(1)
            lstQuestion = ["Quelle est le résultat de l'oppération ", str(a), " + ", str(b), "?"]
            question = "".join(lstQuestion)
            lblQuestion = tk.Label(self, text=question)
            lblQuestion.pack()
            res=tk.IntVar()
            entryRes= tk.Entry(self, textvariable= res)
            entryRes.pack()
            print(i)

I try to put a flag with a while the flag is not true, and turn the flag true when I have the good answer but it doesn't work. I don't now how to do it... Thank you in advance

  • In this case you could use something like [tkwait](https://stackoverflow.com/a/74162322/13629335) but make sure you read the warnings about it. So basically you would need a variable that you set when the user **locks** the answer and replace the print function with `entryRes.wait_variable(my_variable)`. as soon as you set `my_variable` the forloop continues. – Thingamabobs Nov 16 '22 at 21:42
  • You should provide minimum reproducible example. I cannot run your code without knowing what addition function and controller does. – Mustafa KÜÇÜKDEMİRCİ Nov 17 '22 at 08:34
  • Used messagebox will solve ur problem. – toyota Supra Nov 17 '22 at 14:18

1 Answers1

0

I created a minimum case that fits your needs

import tkinter as tk

from tkinter import ttk


mainwindow = tk.Tk()
row = 0


def validation(widget,value,number1,number2):
   result = int(number1) + int(number2)
   if(value.isnumeric() and int(value) == result):
      addLayer(int(number1),int(number2)+1)
      mainwindow.nametowidget(widget)["state"] = "disabled"
   return True

   
def addLayer(number1,number2):
   global row
   lclFrame = tk.Frame(mainwindow)
   lclFrame.grid(row=row,column=0)
   if(row==10):
      tk.Label(lclFrame,text="You succesfully completed the test!").grid(row=0,column=0)
      return
   vcmd = lclFrame.register(validation)
   tk.Label(lclFrame,text=f"what is sum of {number1} and {number2}").grid(row=0,column=0)
   tk.Entry(lclFrame,validate="key",validatecommand=(vcmd,"%W","%P",number1,number2)).grid(row=1,column=0)
   row +=1

addLayer(2,3)

mainwindow.mainloop()

You can use Entry widgets validate feature. In example above, every key stroke made into entry widget sent into validation function. Only if validation function returns True then entry text would change so we always return True. In validatecommand= parameters, we add arguments which we want to send validating function. In validation function, we check if value given by user is true, we add another layer of question by calling addLayer function. However, if row number which means in this case number of questions is 10. We disable correctly entered entry boxes to prevent spamming layers.

This case only accepts true answers, however by editing validation function you can make anything you want with answers.