因此,我正在创建一个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。
答案 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。