我的Python心路历程 第十一期 (11.4 初探python调试总结之互相import引发的全局变量不生效问题)

背景

今日我的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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值