繁体   English   中英

tkinter - 为什么在 function 之后全局变量没有更改?

[英]tkinter - Why is global variable not changed after function?

window = Tk() #create app window



#custom message box function 
def answerMessagebox(returnValue, toplevel, functionName=""):
    global answer
    answer = returnValue

    print("The answer variable is (inside answerMessagebox function): ", answer)

    if functionName: #if there is a command do this
        functionName()

    toplevel.destroy() #close messagebox

def messageboxYesNo(title, text, functionName=""):

    toplevel = Toplevel(window)
 
    toplevel.title(title)
    
    l1=Label(toplevel, image=iconQuestion)
    l1.grid(row=0, column=0, pady=(7, 0), padx=(10, 30), sticky="e")

    l2=Label(toplevel,text=text)
    l2.grid(row=0, column=1, columnspan=3, pady=(7, 10), sticky="w")
 
    b1=Button(toplevel,text="Yes",command=lambda: answerMessagebox(True, toplevel, functionName=functionName),width = 10)
    b1.grid(row=1, column=1, padx=(2, 35), sticky="e")

    b2=Button(toplevel,text="No",command= lambda: answerMessagebox(False, toplevel), width = 10)
    b2.grid(row=1, column=2, padx=(2, 35), sticky="e")



def close_window():
    driver.quit() 
    window.destroy()
    exit() 

exitButton = Button(window, text="Exit", command=lambda: messageboxYesNo("QUIT", "Are you sure you want to Quit?", functionName=close_window), font=breadtextFont, bg=button_color, fg=button_text_color) #add a exit button
exitButton.pack(side="top", anchor=NE, padx=15, pady=10)

window.mainloop()

如果我按下否按钮,则answerMessagebox内的print语句正确打印出False ,如果我按下是按钮,则打印出True 我想在另一个 function 中使用该答案并根据答案执行逻辑。

def foo():
    global answer
    answer = ""
    messageboxYesNo("Submit report", "Are you sure you want to submit?") #expect global variable to change to True if press Yes-button. But it actually prints out nothing. 

    if answer:
       #do something 

foo() function 内部,全局变量answer在我运行messageboxYesNo function 后没有改变,因此if answer:语句没有运行。

为什么全局变量不变? 我猜这是因为foo()继续并且没有等待messageboxYesNo function 完成。 我该如何解决这个问题?

我使用全局变量,因为 tkinter 中的command=无法从 function 返回任何内容。

最后一个打印语句在您按下Exit按钮后立即执行。 它只是为标签和是/否按钮创建 UI,打印最后一条语句并存在 function。

当您按下是/否按钮时,它会执行answerMessagebox function。 如果您想在对answer进行更改后执行某些操作,请将其添加到answerMessagebox function 的末尾,或者(可能在将其放在同一功能上没有意义的情况下)执行单独的 function在 function 的末尾:

def answerMessagebox(returnValue, toplevel, functionName=""):
    answer = returnValue
    
    # The logic you've written already
    
    toplevel.destroy() #close messagebox
    
    everythingAfterYesNoPress(answer)


def everythingAfterYesNoPress(answer = ""):
    print("This is answer variable after messageboxYesNo function", answer)

foo()被执行时,您的代码不会显示,但是在开始时,您已经用空字符串覆盖answer的值,后来计算结果为 false:

def foo():
    global answer
    answer = "" # Remove this line

这种全局变量的使用存在很多问题,OOP 重构将是解决它的最佳方法。 但是,针对此特定问题的快速解决方案是将answerMessagebox的结果传递给回调:

def answerMessagebox(returnValue, toplevel, functionName=""):
    answer = returnValue
    print("The answer variable is (inside answerMessagebox function): ", answer)

    if functionName:
        functionName(answer)
    # ...

def foo(answer):
    # ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM