if我是菜鸡 2023-03-25 14:43 采纳率: 60%
浏览 85
已结题

关于#python#的问题,请各位专家解答!

AttributeError: 'NoneType' object has no attribute 'render'
这个错误的意思是什么呢?是错在哪个方向呢?

AttributeError                            Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_5180\339058624.py in <module>
     71 
     72 #输出并生成demo2.html
---> 73 net.show('C:\\Users\\Desktop\\资金可视化追踪.html')

D:\mac\lib\site-packages\pyvis\network.py in show(self, name, local, notebook)
    544         print(name)
    545         if notebook:
--> 546             self.write_html(name, open_browser=False,notebook=True)
    547         else:
    548             self.write_html(name, open_browser=True)

D:\mac\lib\site-packages\pyvis\network.py in write_html(self, name, local, notebook, open_browser)
    513         getcwd_name = name
    514         check_html(getcwd_name)
--> 515         self.html = self.generate_html(notebook=notebook)
    516 
    517         if self.cdn_resources == "local":

D:\mac\lib\site-packages\pyvis\network.py in generate_html(self, name, local, notebook)
    477             physics_enabled = self.options.physics.enabled
    478 
--> 479         self.html = template.render(height=height,
    480                                     width=width,
    481                                     nodes=nodes,

AttributeError: 'NoneType' object has no attribute 'render'
源代码如下:
```python
import pandas as pd
import networkx as nx
from pyvis.network import *
# 读取Excel表格
df_trade = pd.read_excel('C:\\Users\\Desktop\\kk.xlsx',converters={'转账日期':str})
#根据交易方向生成有向图digraph
G1=nx.from_pandas_edgelist(df_trade.loc[df_trade['转账方向'] == '转出'],
                          source='户名',target='对方户名',
                          edge_attr=['转账日期','转账金额'],
                          create_using=nx.MultiDiGraph()
                          )
G2=nx.from_pandas_edgelist(df_trade.loc[df_trade['转账方向'] == '转入'],
                          source='对方户名',target='户名',
                          edge_attr=['转账日期','转账金额'],
                          create_using=nx.MultiDiGraph()
                          )
G = nx.compose(G1,G2)
for edge in G.edges(data=True):
    edge[2]['title'] = str(edge[2]['转账金额'])

# 计算点的 中介中心性(Betweeness Centrality)
betweenness = nx.load_centrality(G)
# 取中介中心性最大的2个点
print(sorted(betweenness.items(),key = lambda x:x[1],reverse=True)[0:2])
# 转为dict存储 后续用于可视化设置点大小
keynodesdict = dict(sorted(betweenness.items(),key = lambda x:x[1],reverse=True)[0:2])    

specEdges = []

# 计算点和其他点的路径长度
pathlen = dict(nx.shortest_path_length(G))
# 找出以'N0','N1'为源头的路径中最长的路径
for node in ['A','B']:
    for k,v in pathlen[node].items():
        # 找出路径中最长的路径
        if (v==max(pathlen[node].values())):
            # 找到最远的目标点,然后将源头和目标点之间的最短路径都提取出来
            # 没有考虑日期因素
            for p in nx.all_simple_edge_paths(G,source=node,target=k):
                for i in range(0,len(p)-1):
                    e1 = p[i]
                    e2 = p[i+1]
                    e1_date = (G.get_edge_data(e1[0],e1[1])[e1[2]]['转账日期'])
                    e2_date = (G.get_edge_data(e2[0],e2[1])[e2[2]]['转账日期'])
                    # 考虑日期因素
                    # 如果后一手的转账日期小于前一手 则路径就到当前为止
                    if e1_date>e2_date:
                        p = p[0:i+1]
                        break
                # 显示有效路径 并存入最短路径list
                print(p)
                specEdges = specEdges + p
# 不同的路径中 边有重复 去重
specEdges = list(set(specEdges))    
    
# 初始化pyvis网络图
net = Network(height='800px',width='800px',directed=True,heading='资金网络')

# 由于两点之间有多条边 必须设置参数
opts = '''
        var options = {
          "physics": {
            "minVelocity": 0.5,
            "solver": "forceAtlas2Based"
          }
        }
    '''
net.set_options(opts)

# 边的标签设置为转账日期
for edge in G.edges(data=True):
    edge[2]['label'] = edge[2]['转账日期']

# 边的光标悬停提示设置为转账金额
for edge in G.edges(data=True):
    edge[2]['title'] = str(edge[2]['转账金额'])+'元'

# 根据点中介度大小设置点的尺寸
for k,v in keynodesdict.items():
    G.nodes[k]['size']=10*(v/min(keynodesdict.values()))

# 根据点中介度大小设置最大三个点为红色
for k,v in list(keynodesdict.items())[0:3]:
    G.nodes[k]['color']='red'

# 将找出来的边标注为红色
for edge in specEdges:
    G.edges[edge]['color']='red'

net.from_nx(G)
#输出并生成demo2.html
net.show('net.html')

```

  • 写回答

7条回答 默认 最新

  • 「已注销」 2023-03-25 15:38
    关注

    参考gpt,这个错误通常表示你正在尝试访问None对象的属性render。None是一个特殊的Python对象,表示缺少值或空值。通常,这个错误发生在你没有正确初始化或创建对象的情况下,尝试访问其方法或属性。

    具体而言,你可能在访问一个未初始化的变量,或者在调用一个函数时,该函数返回了None值,然后你尝试访问该对象的属性render。解决这个错误的方法通常包括检查代码中的变量初始化和函数返回值,确保它们都不是None,或者在访问属性之前检查对象是否为None。

    这个问题的发生原因是在 generate_html 函数中,template 对象为 NoneType 类型,导致没有 render 属性。 generate_html 函数是由 write_html 函数调用的。在 write_html 函数的第 515 行,它调用了 generate_html 函数。generate_html 函数中, template 对象应该是由 template 方法生成的。因此,此处最可能出现的问题是模板文件无法加载。可能由于模板文件不存在、模板文件格式错误或无法访问模板文件等原因导致模板文件无法加载。

    解决方法包括:

    检查指定的 HTML 文件是否存在并且路径是否正确。
    检查是否使用了正确的 pyvis 版本。
    检查是否安装了必需的软件包。
    确保您有读取模板文件的权限。
    如果您已经安装了正确的软件包,还可以尝试重新安装它们。
    您可以尝试打印 template 对象以获取更多有关问题的详细信息,以便更好地了解问题的来源和解决方法。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月2日
  • 赞助了问题酬金15元 3月25日
  • 修改了问题 3月25日
  • 创建了问题 3月25日

悬赏问题

  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教