背景
今日我的Python心路历程是 初探python调试总结之互相import引发的全局变量不生效问题)
分析
问题现象:A和B相互import,A中针对全局变量t给出了定义初始化及设置赋值,但在B中调用时依然显示为初始化的值,而非A设置赋值后的值,怎么样才能获取全局变量的当前希望值就是今天要讨论的话题。
方案
A.py文件代码为:
from B import mWin #直接import会报编译AttributeError错误
#关联主窗口的入口函数
def stockindex_function(): # 全景功能代码
# 必须添加以下控件销毁代码,不然点击一次按钮框架长生一次,显示的画面会多一次,你可以将下面的代码删除测试看下
for widget_graphic_main_frame in mWin.centre_frame.winfo_children():
widget_graphic_main_frame.destroy()
stockindex_window = tk.PanedWindow(mWin.centre_frame, orient='vertical', opaqueresize=False)
stockindex_window.pack(fill=BOTH, expand=1)
B.py文件代码为:
import A
# **********************************************************************************************************************
# 全局变量定义,引用是请先声明global,否则会被示为局部变量
mWin = None
# 全局变量设置结束
# **********************************************************************************************************************
#main执行入口
if __name__ == '__main__':
global mWin, tt # 声明引用全局变量
mWin = mainWindow()
mWin.inition(u'GP量化评估分析')
如上代码执行结果显示,mWin在B.py文件执行没有问题,但执行A.py文件代码时发现mWin为None,说明全局变量被更改过,琢磨和测试良久发现,因为相互有import,所以在执行A.py文件代码的时候会又执行一次B.py文件的全局代码,也就是mWin = None又被执行了一次,问题应该就出在这里了。
看了些资料,有个建议很好将全局变量单独.py文件定义并采用类的方式,特别是针对多个全局变量特别有效。
效果
优化后运行效果如下图所示:
附
所有各部分代码如下所述。
globalvar.py代码:
#!/usr/bin/python
# coding=UTF-8
#定义全局变量库
class GlobalVar:
myWin = None
def setMyWin(meWim):
GlobalVar.myWin = meWim
def getMyWin():
return GlobalVar.myWin
main.py代码:
import index_data
import globalvar
#main执行入口
if __name__ == '__main__':
# global mmWin, tt # 声明引用全局变量
mmWin = mainWindow()
mmWin.inition(u'GP量化评估分析')
#赋值全局变量
globalvar.set_bottomFrame_value(mmWin.bottom_frame)
globalvar.set_centerFrame_valure(mmWin.centre_frame)
globalvar.setMyWin(mmWin)
print '__main__'
print mmWin.centre_frame
index_data.py代码:
import globalvar
def stockindex_function(): # 全景功能代码
# 获取全局变量
mWin = globalvar.getMyWin()
print('stockindex_function')
print(mWin.centre_frame)