Как дождаться возврата значения из функции, которая использует графический интерфейс tkinter и принимает ввод от пользователя, перед выполнением последующих операторов - PullRequest
0 голосов
/ 09 февраля 2019

Итак, я создаю проект Python, в котором я извлекаю строки из базы данных, используя mysqlite.я вызываю функцию mark (diff), которая извлекает строки в зависимости от значения, введенного пользователем через tkinter OptionMenu, добавляет строки в список и возвращает их обратно в функцию «question».

Проблема заключается в том, что после того, как я вызову mark (diff) из функции «question», он не ожидает завершения функции mark () и читает входные данные, вместо этого он продолжает следующий оператор выполнения

я где-то читал о методе after () в tkinter, но я не был уверен, применяется ли он здесь или как его следует применять

 def mark(diff):
    diff=diff.upper()
    win=Tk()
    win.title("Question Paper Generator")
    win.configure(background='#ECECEC')
    win.geometry('650x500')
    j=0
    t1 = StringVar(win)
    t1.set("THEORITICAL"
    obj1 = []

    def clicked1():
        t11=t1.get()

        sql_id_cmd1 = ("SELECT MAX(ID) FROM "+diff+"4"+str(t11))
        cur.execute(sql_id_cmd1)
        data1=cur.fetchone()
        i1 = data1[0]
        rand1 = random_num_gen(i1)

        sql_in_cmd1 = ("SELECT QS FROM "+diff+"4"+str(t11)+" WHERE "+"ID = "+str(rand1[j]))
        cur.execute(sql_in_cmd1)
        obj1.append(list(cur.fetchone()))

        return obj1

    l4 = Label(win, font="SF\Mono 16 bold", text = "Enter Question Type",background='#ECECEC',justify='left')
    l4.grid(column=0, row=1,padx=20,pady=10)

    frame5=Frame(win)
    frame5.grid(column=0,row=2,padx=0,pady=10)
    optionm = OptionMenu(frame5,t1,"THEORITICAL","PROOF","MCQ","NUMERICAL")
    optionm.grid(column=0, row=0)

    frame4=Frame(win)
    frame4.grid(column=0,row=11,padx=0,pady=10)
    btn = Button(frame4, text="Submit",command=clicked1)
    btn.grid(column=0, row=0)


def questions(diff):
    obj1=[]
    obj2=[]
    obj3=[]
    obj1=mark("Easy")
    obj2=mark("Easy")
    obj3=mark("Easy")
    pdf_gen(obj1,obj2,obj3)

функция mark () возвращает список в obj1, но вместоожидая ввода от пользователя, он немедленно выполняет функцию pdf_gen с obj1, obj2, ob3 как None, программа должна ожидать возвращенный список в obj1, obj2, obj3 и затем только вызывать pdf_gen ()

РЕДАКТИРОВАТЬ -

Я попытался использовать кнопку, как это было предложено, но ошибка все еще сохраняется

def questions(diff):

        obj1=[]
        obj2=[]
        obj3=[]

        obj1=mark("Easy")
        obj2=mark("Easy")
        obj3=mark("Easy")

        if obj1 is not None and obj2 is not None and obj3 is not None:
            win=Tk()
            win.title("Question Paper Generator")
            win.configure(background='#ECECEC')
            win.geometry('650x500')
            frame=Frame(win)
            frame.grid(column=0,row=3,padx=0,pady=10)
            addbutton=Button(frame,text="Generate")
            addbutton.config(height = 2, width = 15,bg='#ECECEC',justify='left',bd='5',relief='raised',command=lambda:pdf_gen(obj1,obj2,obj3) )
            addbutton.grid(column=0,row=20)
            win.mainloop()

Здесь он вообще пропускает операторы внутри оператора if и завершает

Если яудалите оператор if и сразу создайте кнопку, исходная проблема сохраняется, и obj1, obj2, obj3 передаются как pone в pdfgen даже после нажатия кнопки «Создать»"нажата

1 Ответ

0 голосов
/ 09 февраля 2019

Ваша архитектура не очень хорошая.Вы создаете obj1 / 2/3, а затем применяете функцию.Но ваш obj1 / 2/3 " на самом деле " считается готовым , после чего пользователь нажимает .Таким образом, вы применяете функцию к объекту, который не готов.

Существует 2 решения:

obj1=...
obj2=...
obj3=...
button_pdf_gen = Button(..., ...,command=pdf_gen)

Пользователь должен нажать на кнопку, чтобы создать PDF-файл.Так что вам нужно проверить в pdf_gen, что все объекты готовы.

Или

По определению click1:

...
if obj1 is ready and obj2 is ready obj3 is ready:
    then pdf_gen()

Когда все obj1 / 2/3 будут готовы, он вызовет pdf_gen.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...