BT源代码学习心得(九):客户端源代码分析(图形界面浅析) -- 转贴自 wolfenstein (NeverSayNever)

来源:互联网 发布:portal软件 编辑:程序博客网 时间:2024/05/18 00:24

BT源代码学习心得(九):客户端源代码分析(图形界面浅析) 
author:wolfenstein 

    客户端将从btdownloadgui.py开始进行分析,这样可以顺便把Python中的GUI编程也看一下。Python中的GUI编程也有很多内容,所以不可能深入得分析,仅仅以BT的源代码为例看一下。
    btdownloadgui.py中使用gtk作为其图形界面的开发库。这个库中提供了很丰富的类,可以来创建图形界面中所需要的各种widget,而在 主要的窗口类DownloadInfoFrame的初始化过程中,程序的主要任务就是创建窗口中要用到的各种各样的widget,并且把它们加入窗体。然 后用connect函数把某个widget上可能会发生的事件与某个处理函数连接起来,这样,一个GUI界面就建立起来了。具体的过程可以参考gtk的每 个类的说明文档,并不困难。
    这里再简单介绍一下btdownloadgui.py中的其它的类。它们通常都是GUI界面中的各种子窗口,需要在某个按钮或者菜单被选中后弹出。我们也可以看到作者在GUI界面方面的设计的一些巧妙之处。
    Validator:在一个基本的Entry上继承的类,但是可以对用户输入的值进行判断,只有出现在有效字符列表中的输入有效。另外在这个类的基础上还 继承了IPValidator,PortValidator,PercentValidator,MinutesValidator对各种输入数据进行校 验。
    RateSliderBox:这是一个表示速率的滑动块,可以根据鼠标的调整显示出对应的速度以及相应的网络连接类型。内部完成了滑块位置和对应速率的转换。
    StopStartButton:停止/开始按钮,可以通过点击这个按钮来临时停止或者恢复所有的种子的下载。
    VersionWindow(显示版本信息),AboutWindow(显示关于信息),LogWindow(显示日 志),SettingsWindow(进行一些参数设置),FileListWindow(文件列表窗口),PeerListWindow(对等客户列表 窗口),TorrentInfoWindow(种子文件信息窗口)都是一个子窗口,它们在相应的功能被调用时会弹出来,其中LogWindow使用到了 LogBuffer中的内容,即在任何需要记录日志的地方调用LogBuffer的log_text函数,然后LogWindow可以把它们都显示出来。
    TorrentBox是一个种子文件下载任务在图形界面上的表示的基类。里面定义了名称标识,状态图标,进度条等等GUI元素,所有的下载任务都以这个类 为基类。KnownTorrentBox则是已经不在下载任务列表的图形界面表示,可以把它拖到下载队列中,这样就可以继续下载这些任务,这有两种情况, 把已经完成的任务拖到下载队列中就表示要继续做种,而把已经失败的任务拖到下载队列中就表示要恢复下载。DroppableTorrentBox是一个增 加了托拽对象处理的类。以DroppableTorrentBox为基类的类有QueuedTorrentBox,PausedTorrentBox
,RunningTorrentBox 分别对应了还在队列中的下载任务,暂停的任务和正在运行的任务。KnownTorrentBox的区域中的项目可以托拽到下载队列中,另外 QueuedTorrentBox和PausedTorrentBox,RunningTorrentBox中的项目可以自由托拽,满足用户对下载任务的 队列管理要求。这里还要提一下,那就是RunningTorrentBox和PausedTorrentBox不能同时出现,它由开始提到的 StopStartButton管理,即暂停/运行所有的任务,而
QueuedTorrentBox是那种由于同时下载的任务的数量的限制而暂时得不到下载的任务,即使StopStartButton的状态是运行所有任务,它也不会被运行,只有当某个下载任务结束或者中止后,系统从队列中选取一个进入运行队列。
    以上是每一个具体的运行项目对应的widget,下面来看它们的容器,HSeparatedBox是一个容器的基类,定义在 BitTorrent/GUI.py中,这个模块中还定义了其它一些为GUI显示方便的函数和对象。HSeparatedBox中可以添加若干子窗口,并 且可以对它们进行重新排列,另外它可以用分割线分割添加进来的子窗口。DroppableBox是HSeparatedBox的子类,它增加的功能是处理 托拽对象离开,KnownBox则又是DroppableBox的子类,它将被填充进若干个KnownTorrentBox,对应的还有 RunningBox和QueuedBox,填充入相应的下载任务的widget(注意到PausedTorrentBox和 RunningTorrentBox不能同时出现,它们都被放在容器RunningBox),而RunningAndQueueBox是一个同时塞进了 RunningTorrentBox和ueuedBox的容器。
    系统中每个TorrentBox保存某个具体种子的信息仅仅是为了显示,当需要的时候,这些widget都是随时被删除,或者创建,或者进行重新排列,这些种子的随着运行的时间一些统计信息发生改变,也会通过这些widget显示出来。
    BitTorrent/TorrentQueue.py模块完成了从GUI界面到实际的种子下载任务的模块中的衔接。它实现了Feedback的接口,这 样当某个种子的下载任务发生变化(如完成,出错等)后,可以及时得通知它,然后显示在GUI界面上。通过分析其它的BT的下载程序(即非图形界面的下载程 序,如btdownloadheadless.py等),也可以看到有一个继承了Feedback接口的类,但是它的实现方式通常是以文字的形式表现出种 子的变化。另外,TorrentQueue模块还可以恢复上次的下载情况(读取一些状态文件),通过所有的下载程序的分析(图形界面的或者文
本 的)我们可以认为,实际执行下载任务的对象是BitTorrent/download.py中的Multitorrent对象为。而 TorrentQueue的代码仍然算在GUI部分中,通过分析它的代码,我们已经知道它已经读取了相应的种子文件中的信息,并且进行了相关的处理。
    由于我们主要是要分析BT的客户端的实际功能代码,因此GUI部分只能比较简略得说一下,其实这部分可以对着gtk的参考手册看相关的图形界面程序的源代 码(btdownloadgui.py,btmaketorrentgui.py),还是比较好分析的。下一次开始就可以分析 BitTorrent/download.py中的Multitorrent,直奔主题了。
原创粉丝点击