在执行后续语句之前,如何等待使用tkinter GUI并从用户那里获取输入的函数的返回值

时间:2019-02-09 10:58:14

标签: python tkinter sqlite

因此,我正在创建一个python项目,在其中使用mysqlite从数据库中提取字符串。我调用一个函数mark(diff),该函数根据用户通过tkinter OptionMenu输入的值提取字符串,并将字符串附加到列表中,然后将其返回“问题”函数。

问题在于,在我从“问题”函数调用mark(diff)之后,它不等待mark()函数完成并读取输入,而是继续执行下一条执行语句

我在tkinter的某个地方读到了after()方法,但是我不确定它是否适用于此或应如何应用

 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中,但不是等待用户输入,而是立即以obj1,obj2,ob3为None类型执行pdf_gen函数 程序应等待返回的列表进入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也将None作为None传递给pdfgen。

1 个答案:

答案 0 :(得分:0)

您的装饰不好。您创建obj1 / 2/3,然后应用一个函数。但是,在用户单击后,您的obj1 / 2/3被“ 实际上”视为已准备就绪。因此,您要在尚未准备就绪的对象上应用功能。

有2种解决方案:

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

用户必须单击按钮以创建pdf。因此,您需要签入pdf_gen以确保所有对象均已准备就绪。

在def clicked1中:

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

当所有obj1 / 2/3准备就绪时,它将调用pdf_gen。