深度Linux软件中心源码分析
Tofloor
poster avatar
z85525006
deepin
2011-11-29 17:31
Author
由于作为一名刚入门的python的初学者,由于在C语言的功底下,才勉强的学习到现在.
虽然我对于Linux的开源世界不是很了解,但是我还是比较喜欢Linux的.
虽然有一些举动让同伴鄙视了,但是我还是会继续努力学习的,慢慢的成为一名合格的Linux程序员.
有什么地方分析不对的,还请大家多多见谅和给予解释,学习学习.
======================================================
打开目录:

点击 src 目录进入,看下面的图片, theme.py!
选区_004.png
一开始看我也找不到北.但是因为是界面程序,所以我决定从界面开始分析.
选区_005.png
我们首先从最上面开始分析,也就是从从界面下手来分析整个源码... ...

主题是可以更换的,可能由于我的是老版本吧..
=============================================================
    打开../src/theme.py源码发行这么一行:
                   self.themeName = evalFile("../theme/list.txt")[0] #加载主题名
打开list.txt一看:
    [
"default",
"stardust",
"blackgold",
"wood",
"deepinblue",
"green",
]
哦!大家顿时差不多就明白了.
===================================================================
../theme/default/ 目录就是现在的主题.原来是更改(theme.py)后面的的[0]改成[1]或者[2],就可以做到更换主题了.

我们开始继续分析上面的标题栏!!

打开 deepin-software-center.py 发现这么一行:

def __init (self)  :的开始就一句可以看到了.
      self.titlebar = titlebar.Titlebar(
            self.showThemeSelectWindow,
            self.showMoreWindow,  
            self.minWindow,     
            self.toggleWindow,  
            self.closeWindow)   
showTemeSelectWindow.... closeWindow都是一些函数,在deepin-software-center.py中自己查看代码.
其实这些函数是要关联起来的,就和它们命名的函数名一样.
============================================================
然后继续往下看: def main(self):
self.topbox.pack_start(self.titlebar.box, False)
这里面的 box是调用 titlebar.py 中 def__init__里面的box.
对!就是这一行代码!   self.titlebar.box  ,看最上面的一行  import titlebar !!
我们打开 ../src/titlebar.h文件来看看!
from draw import *  一开始就调用了这个,这个文件里面全部都是画控件的函数,等一下分析!

发现代码: (几乎所有上面绘制都使用了这种方式调用)
        self.closeButton = gtk.Button()
        self.closeButton.connect("button-release-event", lambda w, e: closeCallback())
        drawButton(self.closeButton, "close", "navigate")
        self.controlBox.pack_start(self.closeButton, False, False)
几乎原理是一样的!
我们来分析 closeButton, button-release-event 这个事件表示的是鼠标放开时产生的事件!
closeCallback() 这个函数可以自己看!self.titlebar = titlebar.Titlebar(...最后一个参数传过来的,有点象函数指针!呵呵呵
w 代码的时  widget
e 代表的时  event
drawButton 让这个函数 带我们走入 draw.py,发现了函数:
def drawButton(widget, iconPrefix, subDir="cell", scaleX=False,
               buttonLabel=None, fontSize=None, labelDColor=None):

又多了一个函数: buttonSetBackground,等下分析:
看看这个:  %s/%s_normal.png         ../cell/close_normal.png            下面的是  ../cell/close_hover.png
后面继续分析,上课去拉!
=============================================================
    我今天也装了深度软件中心 2.0,给我的感觉就是一个字'爽'... ...
   
    经过整理,我来先大家讲解深度Linux软件中心的界面布局情况.
    在 deepin-software-center.py class DeepinSoftwareCenter(object): 函数中:
    #有这几行代码
   
  
  1.    #这个就装全部界面布局的 主容器,是一个垂直容器
  2.      self.mainBox = gtk.VBox()
  3.     #topbox代表上部份
  4.     self.topbox = gtk.VBox()
  5.     #topbar事件盒子
  6.     self.topbar = gtk.EventBox()
Copy the Code
    #这一句就是 精彩推荐,软件仓库,软件更新,软件卸载...的布局
    #navigatebar.py中的class NavigateBar(object):的def __init__(self):中有这么一句
    #self.box = gtk.HBox(),这个就是将所有(logo,navbox)放入box横向容器盒子
    #先放logo,后放navbox. ps: logo就是左侧的: 软件中心图标, navbox就是: 精彩推荐,软件仓库...下载管理.
    #所以 navigatebar.box 就是可以调用的.
    self.navigatebar = navigatebar.NavigateBar() #
   
    #继续看 deepin-software-center.py的代码,def main(self):有这几行代码.
  1.    
  2.     1.self.window.add(self.mainBox)
  3.     2.self.mainBox.pack_start(self.topbar, False) #事件盒子,不解释,比如象:鼠标按下,放开.
  4.     3.self.topbar.add(self.topbox)#将事件盒子的事件邦定给上部分的布局.
  5.     4.self.topbox.pack_start(self.titlebar.box, False)#主题选择...缩小,放开,关闭按钮.
  6.     5.self.topbox.pack_start(self.navigatebar.box, False)#精彩推荐,软件仓库...下载管理.
  7.     6.self.mainBox.pack_start(self.bodyBox) #不解释,大家都明白这句话的意思.我慢慢说来.
Copy the Code
    window.add就是将 mainbox添加进窗体.
    我们大体就明白了,
    mainbox上面包含 topbox,中间就是bodyBox(self.bodyBox = gtk.HBox()),最下面就是 statusbar.
    这就是上,中,下部分的整体布局.
    bodyBox里面海包括了一些,但是我们先分析上部份,后面再分析下部分.
     #上部份大体就是这样:
    topbox先放入titlebar.box
    后放入navigatebar.box
    这就是上半部分的整体布局.
    我们来分析一下 titlebar.box,后面再下来分析 navigatebar.box!我们要一步步的分析.
    从外到内,从上到下的分析。然后再分析内部实现的重要代码,比如下载,更新... ...
    对了,提醒大家一句,那个主题选择不是菜单,也是一个窗体.(代码再:themeSelect.py 我们以后再分析)
    #将窗体放在最底部的左侧以及没有标题边框,假象,根据坐标弹出菜单(窗体),太漂亮了!
   #gtk_window_set_decorated (GTK_WINDOW(win1.window),FALSE);
   #gtk_window_set_resizable (GTK_WINDOW(win1.window),FALSE);
    self.window.set_decorated(False)
    self.window.set_resizable(False)
    手法牛X,向王勇学习了!
    待续... ...我要学习了![整理需要时间]
==================================================
我们分析上部分的 topbox中的: navigatebar.box ,这里就是logo,还有精彩推荐....下载管理.

代码在 navigatebar.py 中.
这是一个 NavigateBar类, 主要是 box 那个参数.
  1. class NavigateBar(object):
  2.     '''Interface for navigate bar.'''
  3.        
  4.     def __init__(self):
  5.         '''Init for navigate bar.'''
  6.         # Init.
  7.         self.getUpgradableNumCallback = None
  8.         self.selectPageCallback = None
  9.         self.getRunningNumCallback = None
  10.         self.iconPadding = 8
  11.         
  12.         self.pageId = PAGE_RECOMMEND
  13.         #保存 logo,精彩推荐....下载管理的总横向容器.
  14.         self.box = gtk.HBox()
  15.         
  16.         self.logoIcon = self.createLogoIcon()#创建logoIcon 注: 最上面最左边的那个 深度Linux软件中心的logo图标.
  17.         
  18.         self.logoAlign = gtk.Alignment()#实例一个 对齐控件
  19.         self.logoAlign.set_padding(0, 0, 60, 10) #设置对齐的填充.
  20.         #可以用下面的函数将logoIcon子构件添加到 对齐构件(logoAlign) 中
  21.         self.logoAlign.add(self.logoIcon)
  22.         
  23.         self.box.pack_start(self.logoAlign, False, False)#将logo图标加入 box
  24.         self.navBox = gtk.HBox() #保存 精彩推介,软件仓库...下载管理.
  25.         self.navAlign = gtk.Alignment() # 对齐控件
  26.         self.navAlign.set(0.3, 0.5, 0.0, 0.0)
  27.         self.navAlign.set_padding(0, 0, 0, 60)
  28.         #可以用下面的函数将 navBox子构件 添加到 对齐构件(navAlign) 中
  29.         self.navAlign.add(self.navBox)
  30.         #将 精彩推介,软件仓库... 添加 进去 box
  31.         self.box.pack_start(self.navAlign, True, True)
  32.         
  33.        #下面的代码顾名思义拉... ... 直接去翻 /image/navigate/.....png就可以发现了.
  34.        #这个函数我们慢慢来解释.
  35.        #下面的函数差不多一样的拉.
  36.         self.recommendIcon = self.createNavIcon(
  37.             "精选推荐",
  38.             # "Recommend",
  39.             "navigate/nav_recommend.png",
  40.             PAGE_RECOMMEND) #PAG....ND在 constant.py中查找.  = 0
  41.         #将精选推荐加入 navbox   
  42.         self.navBox.pack_start(self.recommendIcon, False, False, self.iconPadding)
  43.         
  44.         self.repositoryIcon = self.createNavIcon(
  45.             "软件仓库",
  46.             # "Repository",
  47.             "navigate/nav_repo.png",
  48.             PAGE_REPO)
  49.        #将软件仓库加入 navBox
  50.         self.navBox.pack_start(self.repositoryIcon, False, False, self.iconPadding)
  51.         
  52.         self.updateIcon = self.createUpdateIcon(
  53.             "软件更新",
  54.             # "Update",
  55.             "navigate/nav_update.png",
  56.             PAGE_UPGRADE,
  57.             self.getUpgradableNum)
  58.        #将软件更新加入 navBox
  59.         self.navBox.pack_start(self.updateIcon, False, False, self.iconPadding)
  60.         
  61.         self.uninstallIcon = self.createNavIcon(
  62.             "软件卸载",
  63.             # "Uninstall",
  64.             "navigate/nav_uninstall.png",
  65.             PAGE_UNINSTALL)
  66.         self.navBox.pack_start(self.uninstallIcon, False, False, self.iconPadding)
  67.         self.downloadIcon = self.createUpdateIcon(
  68.             "下载管理",
  69.             # "Download",
  70.             "navigate/nav_download.png",
  71.             PAGE_DOWNLOAD_MANAGE,
  72.             self.getRunningNum)
  73.         self.navBox.pack_start(self.downloadIcon, False, False, self.iconPadding)
  74.         #最后是显示box中所有的内容... ...
  75.         self.box.show_all()
Copy the Code

       C语言代码实例:【如果不明白,看看C语言代码,这是一个很乱的代码,因为cgtk没有完全的封装的好,怕影响到各位学习源码和绘制控件的方法.图片是软件中心的
     
有图有真相:

上次发了错误的代码,这次是王勇帮我改正,一个C语言画控件的小例子,我把封装了一点点的cgtk也发上去了,大家大家看看C语言多参数(...)的使用和指针的部分使用.由于本人能力有限,有不足的地方还往改正.
重绘.tar.gz
===============================================================
本来是想 图文并茂的,可惜只能链接其它站点的图片,所以整理起来比较麻烦.下次继续分析!~!
Reply Favorite View the author
All Replies
一天
deepin
2011-11-29 17:50
#1
表示支持
Reply View the author
tuhaihe
deepin
2011-11-29 20:24
#2
赞!
Reply View the author
57548522
deepin
2011-11-30 20:54
#3
不懂编程    看不懂
Reply View the author
s.******[email protected]
deepin
2011-12-01 08:19
#4
呵呵,学好了可以帮王勇开发了。
Reply View the author
z85525006
deepin
2011-12-01 18:43
#5
呵呵,学好了可以帮王勇开发了。
你怎么知道是我,晕。我要潜水... ...隐身.
Reply View the author
harford
deepin
2011-12-02 00:56
#6
我打算跟着学习。赞楼主
Reply View the author
z85525006
deepin
2011-12-02 02:38
#7
我打算跟着学习。赞楼主
是啊!赶快学习python,我学的是 python核心编程和pygtk只要你感兴趣,每日每夜的学习,吸收新的东西!
加油啊!我夜支持你啊`下了,吃饭!
Reply View the author