Python 如何使用tkinter在嵌套函数中创建全局变量?
我使用tkinter和一些嵌套函数编写了一些代码(见下面的代码),并在pycharm中得到警告“全局变量‘value’在模块级别未定义”。程序按预期工作(窗口标题重命名为“文本0”),但我仍然收到警告。。。我必须改变什么才能摆脱这个警告?(程序比较复杂,我需要像它一样启动它,使用Python 如何使用tkinter在嵌套函数中创建全局变量?,python,variables,tkinter,global,nested-function,Python,Variables,Tkinter,Global,Nested Function,我使用tkinter和一些嵌套函数编写了一些代码(见下面的代码),并在pycharm中得到警告“全局变量‘value’在模块级别未定义”。程序按预期工作(窗口标题重命名为“文本0”),但我仍然收到警告。。。我必须改变什么才能摆脱这个警告?(程序比较复杂,我需要像它一样启动它,使用窗口。在之后,我还需要所有功能) global关键字在函数中用于控制变量的赋值。通常在函数value=“bar”中,在本地函数名称空间中创建一个“值”global value告诉python改用全局名称空间 在当前代码中
窗口。在之后,我还需要所有功能)
global
关键字在函数中用于控制变量的赋值。通常在函数value=“bar”
中,在本地函数名称空间中创建一个“值”<同一函数中的code>global value
告诉python改用全局名称空间
在当前代码中,在调用函数_3
之前,模块级值
变量将不存在。在调用函数3
之前尝试使用值的任何操作都将得到名称错误
<代码>功能_1
就是一个很好的例子;如果在函数_3
之前调用,则会出现错误。您的代码可能永远不能在函数_3
之前调用函数_1
,但这对于代码的管理员或未来的维护人员来说是很难知道的。这就是你得到警告的原因
解决方案是为程序合理的值设置默认值。我不知道什么对你有效,但这里有一个例子,它提供了一个信息。顺便说一句,函数1
中不需要全局值。它的工作是控制赋值,您可以读取全局变量而无需任何附加注释
from tkinter import *
value = None
def function_1():
if value is not None:
window.title("text " + value)
else:
import tkinter.messagebox
tkinter.messagebox.showerror("Error", "Do the thing before the thing")
def function_2():
def function_3():
global value
value = ent.get()
if value == '0':
function_1()
ent = Entry()
ent.pack()
button = Button(text="ok", command=function_3)
button.pack()
window = Tk()
window.after(0, function_2)
window.mainloop()
button=button(text=“ok”,command=function\u 3)
不起作用,因为“function\u 3”不是模块级变量。您是否打算从function\u 2
返回function\u 3
,并执行button=button(text=“ok”,command=function\u 2())
?很抱歉,代码没有缩进,它位于function 2Right中,但问题是function\u3
对command=function3
不可见。运行代码会得到name错误:未定义名称“function_3”
。
from tkinter import *
value = None
def function_1():
if value is not None:
window.title("text " + value)
else:
import tkinter.messagebox
tkinter.messagebox.showerror("Error", "Do the thing before the thing")
def function_2():
def function_3():
global value
value = ent.get()
if value == '0':
function_1()
ent = Entry()
ent.pack()
button = Button(text="ok", command=function_3)
button.pack()
window = Tk()
window.after(0, function_2)
window.mainloop()