最近需要做一个组织树关系解析的功能,用Python和QT先试试水。
没有什么实际用处,就是做着玩玩。
先看看效果:
\"在这里插入图片描述\"
就是这样一个简单的组织树展示功能。
首先组织树的内容是存储于数据库中的,数据库结构如下:
\"在这里插入图片描述\"
都是些测试数据,组织关系中包含组织名称,组织id,副组织id,描述信息,更新时间。
数据库使用的是简单的sqlite,用python解析也比较方便。
下面贴出数据库部分的代码。

import sqlite3
g_dict = {} ##全局变量存储,主要是方便外部调用时关闭sqlite链接

#### 打开数据库链接
def ConnectSqlite():
    if g_dict.has_key(\"conn\"):
        print \"connect ready.\"
        return
    conn = sqlite3.connect(\'CHWYData.db\')
    cursor = conn.cursor()
    g_dict[\"conn\"] = conn
    g_dict[\"cursor\"] = cursor
#### 关闭数据库链接
def CloseSqlite():
    if g_dict.has_key(\"conn\"):
        g_dict[\"conn\"].close()
        g_dict.clear()
#### 组织树解析类
class COrganization:
    Id = 0;
    Name = \"\";
    De ion = \"\";
    ParentId = 0
    UpdateTime = \"\"
    def __init__(self,id):
        self.AddSubOrg(id);
        pass
    def AddSubOrg(self,id):
        self.SubOrgs = []
        sqlStr = \"select * from Organization where ParentId = \"+str(id)
        g_dict[\"cursor\"].execute(sqlStr)
        OrganizationInfo = g_dict[\"cursor\"].fetchall();
        if len(OrganizationInfo) > 0:
            pass
        for info in OrganizationInfo:
            tmpOrg = COrganization(info[0])
            tmpOrg.Id = info[0]
            tmpOrg.Name = info[1]
            tmpOrg.De ion = info[2]
            tmpOrg.UpdateTime = info[4]
            tmpOrg.ParentId = id
            self.SubOrgs.append(tmpOrg)

解析的关键就是使用了回环调用,具体思路如下:

  1. 解析父节点ID为0时的子节点信息,将其存储在SubOrgs数组中。
  2. 子组织类构造时会进行其子组织查找,将其子组织信息保存在SubOrgs中。
  3. 回环调用,直至数据库查找无子组织为止。

非常简单,但是使用Python类中的数组数据时需要注意,SubOrgs在每个子类中需要进行清空,否则会保留上一次操作的信息,导致数据冗余。
下面贴上python主函数调用的代码:

# -*- coding: utf-8 -*-
import os,sys
from PyQt4 import QtCore, QtGui ## QT模块
import un d ## UI展示模块
import OperatorSqlite ## sqlite操作模块

reload(sys)
## 设置默认字符
sys.setdefaultencoding(\'utf-8\')

## 添加树节点  
def AddOrgList():
    g_main.OrgTreeWidget.setColumnCount(1);
    header = [u\'组织结构\']
    g_main.OrgTreeWidget.setHeaderLabels(header)
    orgs = OperatorSqlite.COrganization(0);
    aa = []
    ItemList = QtGui.QTreeWidgetItem()
    ItemList.setText(0, orgs.SubOrgs[0].Name);
    GetAllOrgFormOrgs(orgs.SubOrgs[0],ItemList,0)
    aa.append(ItemList)  
    g_main.OrgTreeWidget.addTopLevelItems(aa)

## 添加所有子节点,回环调用
def GetAllOrgFormOrgs(orgs,rootItem,index):
    for org in orgs.SubOrgs:
        item = QtGui.QTreeWidgetItem()
        item.setText(0,org.Name);
        rootItem.addChild(item)
        print org.Id, org.Name ,index
        GetAllOrgFormOrgs(org,item,index+1)
## UI 类    
g_main = un d.Ui_MainWindow()
if __name__ == \"__main__\":
    OperatorSqlite.ConnectSqlite()
    app = QtGui.QApplication(sys.argv) 
    Form = QtGui.QMainWindow()
    g_main.setupUi(Form)
    AddOrgList()
    Form.show()
    sys.exit(app.exec_())

最后附上UI模块的图片:
\"在这里插入图片描述\"

以上为本次组织树解析尝试的所有内容。

收藏 打印