![](/img/trans.png)
[英]why passing global numpy variable into function changed after the code run?
[英]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.